将NSDictionary
文字作为对象传递给-performSelector:onThread:withObject:waitUntilDone:
会导致其崩溃,因为其他线程的运行循环的autoreleasepool会尝试释放它。
解决此问题的最佳方法是什么?只是保留对象还是有更好的做法?
(不用说这个项目没有使用ARC。)
最佳答案
除非您在该线程上显式调用[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(), ^{
//...
});
});
关于objective-c - -performSelector:onThread:withObject:waitUntilDone的内存问题:,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31539805/