引用块内的实例variables

假设我有一个类(非ARC环境):

@interface SomeObject : NSObject { UILabel *someLabel; dispatch_queue_t queue; } - (void)doAsyncStuff; - (void)doAnimation; @end @implementation SomeObject - (id)init { self = [super init]; if (self) { someLabel = [[UILabel alloc] init]; someLabel.text = @"Just inited"; queue = dispatch_queue_create("com.me.myqueue", DISPATCH_QUEUE_SERIAL); } return self; } - (void)doAsyncStuff { dispatch_async(queue, ^{ ... // Do some stuff on the current thread, might take a while ... dispatch_async(dispatch_get_main_queue(), ^{ someLabel.text = [text stringByAppendingString:@" in block"]; [self doAnimation]; } } } - (void)doAnimation { ... // Does some animation in the UI ... } - (void)dealloc { if (queue) { dispatch_release(queue); } [someLabel release]; [super dealloc]; } 

如果我的块被踢开,然后所有其他的持有这个对象的实例的引用释放它,我保证dealloc将不会被调用,因为嵌套块引用实例variables(和自我) – 那dealloc将在嵌套块退出后发生? 我的理解是,我的块有一个强烈的自我的参考,所以这应该是犹太教。

这很好,因为你说的原因。

重要的是要注意的是,如果类(由self表示)以任何方式保留块,则将创build一个保留周期。 因为你正在定义它,并将其传递给dispatch_async ,你应该没问题。

你是绝对正确的。 该块在两种情况下保留自己:

  1. 你在块内使用自己。
  2. 您直接在块内部访问实例variables。

你的嵌套块是好的两个计数。 因此,块在执行完成后会发生dealloc。

另一个值得注意的事情是你的queue也是一个实例variables。 我最初的想法是因为它是一个实例variables, self也得到保留,直到块完成执行。 然而,当我testing出来的时候实际发生的事情是只有queue被保留, self被释放。 我无法find这个文件。