-performSelector的内存问题:onThread:withObject:waitUntilDone:

时间:2015-07-21 13:02:51

标签: objective-c cocoa memory-management nsthread

NSDictionary文字作为对象传递给-performSelector:onThread:withObject:waitUntilDone:将导致它崩溃,因为另一个线程的运行循环的autoreleasepool将尝试释放它。

处理此问题的最佳方法是什么?只需保留对象或是否有更好的做法?

(不用说这个项目不使用ARC。)

1 个答案:

答案 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(), ^{
      //...
    });
  });