将NSDictionary
文字作为对象传递给-performSelector:onThread:withObject:waitUntilDone:
将导致它崩溃,因为另一个线程的运行循环的autoreleasepool将尝试释放它。
处理此问题的最佳方法是什么?只需保留对象或是否有更好的做法?
(不用说这个项目不使用ARC。)
答案 0 :(得分:0)
字典将不添加其他线程的自动释放池,除非您在该线程上明确调用[dictionary autorelease]
。
可能是原始线程的自动释放池,它释放了该对象。使用文字语法创建NSDictionary
实例时,会自动释放它(+[NSDictionarydictionaryWithObjects:forKeys:count:]
is called under the hood)。
old NSObject documentation我发现了{约performSelector:onThread:withObject:waitUntilDone:
)
此方法保留接收器和arg参数,直到之后 选择器执行
所以你必须在某个地方过度发布字典。
我会使用Grand Central Dispatch而不是performSelector
方法。这些块隐含地保留了它们捕获的变量,因此在大多数情况下,您不必担心内存管理:
NSDictionary *dictionary = @{@"foo" : @"bar"};
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//do something with the dictionary
[dictionary description];
//if needed, do something on main thread once the background work is finished
dispatch_sync(dispatch_get_main_queue(), ^{
//...
});
});