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/

10-09 18:44