gpt4 book ai didi

ios - iOS7 上的 NSFileManager 无限循环

转载 作者:行者123 更新时间:2023-11-29 03:31:27 25 4
gpt4 key购买 nike

我对 iOS 和 Objective-C 开发都很陌生,我的任务是将应用程序从 iOS 6 移植到 iOS 7。最明显的问题之一是明显的竞争条件,导致应用程序锁定并最终崩溃。在 iOS7 设备上,应用程序大约 75% 的时间成功启动,大约 25% 的时间挂起;我们从未在 iOS6 设备上遇到过这种行为。

使用调试器,我已将范围缩小到“ImageLoader”中出现的问题。我无法确定这是 Apple API 还是外部库的一部分 - 我无法找到有关它的 Apple 文档,但我也无法在任何地方找到它作为库,以及 ImageLoader 的使用是使用 Apple API 的直接结果:[[NSFileManager defaultManager] createFileAtPath:_filePath content:NULL attribute:NULL];

当锁发生时,有两个线程访问ImageLoader。两者都比 ImageLoader::recursiveInitialization() 低了几步。一个卡在 ImageLoader::recursiveSpinLock() (特别是“dyld`OSAtomicCompareAndSwapLongBarrier”)中,而另一个则卡在“libsystem_kernel.dylib`__psynch_mutexwait:”中。在我看来最有可能的是,这是一个未正确实现的互斥体,可能在内核中。

其中一个线程是主应用程序线程,我可以轻松地浏览该代码。另一个线程始终是应用程序创建的第二个线程,并且不包含应用程序代码;我不确定如何弄清楚它是在哪里或如何创建的。

相关代码:

[[NSFileManager defaultManager] removeItemAtPath:[_filePath stringByAppendingString:tmp] error:nil];
if (![[NSFileManager defaultManager] moveItemAtPath:_filePath toPath:[_filePath stringByAppendingString:tmp] error:nil]) {
return;
}

NSFileHandle *read = [NSFileHandle fileHandleForReadingAtPath:[_filePath stringByAppendingString:tmp]];
[[NSFileManager defaultManager] createFileAtPath:_filePath contents:NULL attributes:NULL];

简而言之:此代码删除 _filePath + ".tmp"处的文件,将 _filePath 处的文件移动到 _filePath + ".tmp",获取 _filePath + ".tmp"上的读取句柄,最后创建一个新文件在 _filePath 处。它锁定在此代码块的最后一行,并且不再继续前进。这似乎是相当平凡的代码,所以我想知道是否有一些操作系统怪癖,我由于缺乏经验而遗漏了。

我做了很多搜索,但没有发现其他人有类似的问题。有谁知道为什么会发生这种情况,或者我可以采取一些步骤来进一步解决此问题?

编辑:我发现此代码分派(dispatch)两个可能同时使用 ImageLoader 的线程。通过修改该代码以在同一线程上操作(即同步),可以避免此错误。~~

在我看来,这仍然是 ImageLoader 代码中的一个错误 - 堆栈跟踪表明存在锁定/互斥机制,但显然它不够线程安全。

编辑2:没关系。我只是设法降低了频率 - 这种情况仍然会发生,但在删除线程分派(dispatch)代码后“仅”发生在 10% 左右。

最佳答案

我会尝试在不同的线程上使用不同的 NSFileManager 对象。不使用 [NSFileManager defaultManager],而是使用 [[NSFileManager alloc] init] 创建单独的实例。看看是否有帮助。文档说你应该能够在不同的线程上使用相同的实例,除非你使用委托(delegate)。但是通过尝试使用不同的实例,它应该有助于验证错误是否发生在您的代码中。

关于ios - iOS7 上的 NSFileManager 无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19729877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com