我已经试图解决这个崩溃问题将近一周了。应用程序在没有任何异常或堆栈跟踪的情况下崩溃。在僵尸模式下通过仪器运行时,应用程序不会以任何方式崩溃。
我有一个在不同线程上调用的方法。 解决崩溃的方案是替换:
[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
块并不能起到任何作用。你需要在每次访问数组时都使用锁(这正是@synchronized
提供的功能)。 - jscs