Objective c 使用-performSelector:onThread:withObject:waitUntilDone的内存问题:
将Objective c 使用-performSelector:onThread:withObject:waitUntilDone的内存问题:,objective-c,cocoa,memory-management,nsthread,Objective C,Cocoa,Memory Management,Nsthread,将NSDictionary文本作为对象传递给-performSelector:onThread:withObject:waituntldone:将导致它崩溃,因为另一个线程的运行循环的自动释放池将尝试释放它 处理这个问题的最佳方式是什么?简单地保留对象还是有更好的实践 (不用说,此项目不使用ARC。)除非您在该线程上显式调用[dictionary autorelease],否则字典不会添加到其他线程的自动释放池中 可能是原始线程的自动释放池释放了对象。使用文字语法创建NSDictionary实例
NSDictionary
文本作为对象传递给-performSelector:onThread:withObject:waituntldone:
将导致它崩溃,因为另一个线程的运行循环的自动释放池将尝试释放它
处理这个问题的最佳方式是什么?简单地保留对象还是有更好的实践
(不用说,此项目不使用ARC。)除非您在该线程上显式调用[dictionary autorelease]
,否则字典不会添加到其他线程的自动释放池中
可能是原始线程的自动释放池释放了对象。使用文字语法创建NSDictionary
实例时,它将自动删除(+[NSDictionarydictionaryWithObjects:forKeys:count:
)
我发现的代码是(关于性能选择器:onThread:withObject:waituntldone:
)
此方法保留接收器和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(), ^{
//...
});
});
除非您在该线程上显式调用[dictionary autorelease]
,否则不会将字典添加到其他线程的自动释放池中
可能是原始线程的自动释放池释放了对象。使用文字语法创建NSDictionary
实例时,它将自动删除(+[NSDictionarydictionaryWithObjects:forKeys:count:
)
我发现的代码是(关于性能选择器:onThread:withObject:waituntldone:
)
此方法保留接收器和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(), ^{
//...
});
});