【发布时间】:2012-08-19 08:17:44
【问题描述】:
我已经尝试修复这个崩溃将近一周了。应用程序崩溃,没有任何异常或堆栈跟踪。应用程序在僵尸模式下通过仪器运行时不会以任何方式崩溃。
我有一个在不同线程上调用的方法。 修复崩溃的解决方案是替换
[self.mutableArray removeAllObjects];
与
dispatch_async(dispatch_get_main_queue(), ^{
[self.searchResult removeAllObjects];
});
我认为可能是时间问题,所以我尝试同步它,但它仍然崩溃:
@synchronized(self)
{
[self.searchResult removeAllObjects];
}
这里是代码
- (void)populateItems
{
// Cancel if already exists
[self.searchThread cancel];
self.searchThread = [[NSThread alloc] initWithTarget:self
selector:@selector(populateItemsinBackground)
object:nil];
[self.searchThread start];
}
- (void)populateItemsinBackground
{
@autoreleasepool
{
if ([[NSThread currentThread] isCancelled])
[NSThread exit];
[self.mutableArray removeAllObjects];
// Populate data here into mutable array
for (loop here)
{
if ([[NSThread currentThread] isCancelled])
[NSThread exit];
// Add items to mutableArray
}
}
}
NSMutableArray 不是线程安全的问题吗?
【问题讨论】:
-
一个
@synchronized块本身不会做任何事情。你需要一个锁(这是@sychronized提供的)围绕每个对数组的访问。 -
为什么@autoreleasepool 在这里?有人可以澄清一下吗?
-
@MuraliMohan"如果你在 Application Kit 的主线程之外进行 Cocoa 调用——例如,如果你创建一个仅 Foundation 的应用程序或者如果你分离一个线程——你需要创建你自己的自动释放池。” developer.apple.com/reference/foundation/nsautoreleasepool
-
在我看来,处理 reader/writers 访问问题的最好方法是使用 GCD (Grand Central Dispatch) 提供的 dispatch_barriers。
标签: objective-c ios multithreading nsmutablearray