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