- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 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/
我在文档目录中有一个名为a.caf的文件。我想在用户在 UITextField 中输入内容并按下更改时重命名它(在 UITextField 中输入的文本应该是新文件名)。 我该怎么做? 最佳答案 您可
我正在尝试为我的应用程序添加 iCloud 支持,并且一直在关注 Apple 自己的 iCloud Design Guide .该指南说我应该通过调用 [NSFileManager ubiquityI
如果我使用 NSFileManager:URLForDirectory 获取沙箱的应用程序支持目录,那么我会得到以下 URL: file://localhost/var/mobile/Applicat
在 iOS 中,我知道有时候 [[NSFileManager alloc] init] 更好——特别是当 [NSFileManager defaultManager] 可能不是线程安全的时候。引用:h
我想对 NSFilePosixPermissions 使用八进制权限(用于 chmod)。 这是我现在所做的: NSFileManager *manager = [NSFileManager defa
我正在尝试编写一些代码来检查或更改(不是恶意或类似的)用户设备上安装的其他 iOS 应用程序。特别是在越狱设备上。在越狱设备上,我能够查看应用程序沙箱之外的文件,当我使用 NSFileManager
在我的 iPhone 应用程序中,我使用默认的 NSFileManager 来复制和移动一些数据。数据量可能有几 MB,因此可能需要几秒钟才能完成复制。如果用户现在启动复制过程并退出应用程序,我可以继
你能发现这行代码中的错误吗?它返回零!该应用程序完全沙盒化,但启用了下载文件夹访问。 NSArray*array = [[NSFileManager defaultManager] contentsO
我有一个动态库,我假设它使用 NSFileManager 的实例。对于我的应用程序,我需要使用 NSFileManager 写入与动态库相同的文件。如果动态库的 NSFileManager 和我的 N
我在我编写的以下代码片段中发现了内存泄漏 NSFileManager *fileManager=[[NSFileManager alloc] init]; fileList=[[fileManager
我需要从应用程序的资源文件夹中复制一些示例文件,并将它们放在应用程序的文档文件夹中。我想出了附加的代码,它编译得很好,但不起作用。我引用的所有目录都存在。我不太确定我做错了什么,有人可以指出我正确的方
如何删除目录中的所有内容而不删除目录本身?我想基本上清空一个文件夹,但保持它(和权限)完好无损。 最佳答案 例如通过使用目录枚举器: NSFileManager *fileManager = [[NS
复制文件时,我想在我的iOS应用程序中包含OSX行为:如果存在,则在其上附加一个计数器: myFile.png => myFile 1.png myFile20.png => myFile20 1.p
我正在尝试创建两个日志文件并将第二个文件中的内容替换为第一个文件中的内容。 我在 AppDelegate 中创建日志的代码 NSArray *paths3 = NSSearchPathForDi
我使用的应用程序可以从互联网下载图像并缓存它们,以便在用户在图像之间来回滑动时实现更快的性能。 我想在关闭 UIViewController 时清除缓存文件夹。所以我创建了这个静态方法。但是,我不断收
我正在使用 NSFileManager 搜索“index.png”文件。如果文件不存在,那么我将尝试显示默认图像。我正在使用下面的代码,但它不起作用。我在这里做错了什么吗? NSString *pat
有没有办法告诉,如果调用 [[NSFileManager defaultManager] removeItemAtPath:filePath error:NULL]; 会失败吗? 最佳答案 我想你想看
我一直在尝试使用 NSFileManager 将图像缓存到我的沙盒应用程序的缓存目录中。不幸的是,我的代码似乎不起作用。 - (BOOL)saveImageToCacheFolder { NS
我正在尝试将数据保存到 NSFileManager 创建的目录中,但是当我尝试检索数据和 NSLog 时,我得到的是空值。另外,当您创建一个目录时,是否意味着您在指定的 url 路径下创建了一个文件夹
我在 Apple 托管我的应用内购买内容。我已成功下载内容,现在我想将其保存在设备中。 [[NSFileManager defaultManager] removeItemAtPath:dstPath
我是一名优秀的程序员,十分优秀!