如何在ARC下使用块完成处理程序释放对象?

时间:2012-01-04 08:17:18

标签: objective-c memory-management automatic-ref-counting objective-c-blocks

这是我的代码中分配对象的常见模式,让它使用完成处理程序执行一些操作并在处理程序中释放它:

LongOperation *foo = [[LongOperation alloc] init];
[foo runWithCompletion:^{
    // run some code and then:
    [foo autorelease];
}];

这很好用,但是当我尝试将代码转换为ARC时,Xcode正确地抱怨它不能简单地从块中删除autorelease,因为那会产生foo个对象离开范围后取消分配。

那么在ARC下编写这种模式的好方法是什么?我可以为foo引入一个实例变量:

[self setFoo:[[LongOperation alloc] init]];
[foo runWithCompletion:^{
    // run some code and then:
    [self setFoo:nil];
}];

...但代码不再是可重入的。

1 个答案:

答案 0 :(得分:4)

在大多数情况下,它应该工作(即,如果有任何内容在foo中引用self,foo将持续足够长的时间以满足该代码,然后才会离开)。如果弱引用存在问题,并且foo看起来应该消失,但是在处理程序运行之后不应该这样做,你可以做类似的事情:

__block LongOperation* foo = [[LongOperation alloc] init];
[foo runWithCompletion:^{
  // do some things
  foo = nil;
}];

请注意,这与此模式相反,导致object / not /在托管内存规则下被捕获。

相关问题