dispatch_async 并保留(非 ARC)

dispatch_async and retain (non-ARC)

在非 ARC 应用程序中,我有一个 NSOperation 子类,它由委托排队,看起来像:

// note that the delegate and element properties are retained

-(id)initWithDelegate:(id<SomeDelegate>)inDelegate element:(SomeElement *)inElement
{
    if (self = [super init])
    {
        [self setDelegate:inDelegate];
        [self setElement:inElement];
    }
}

-(void)dealloc
{
    [_delegate release];
    [_element release];
    [super dealloc];
}

-(void)main
{
    // do stuff

    dispatch_async(dispatch_get_main_queue(), ^{
         [[self delegate] doSomething:[self element]];
    });
}

由于 [[self delegate] doSomething:[self element]] 将在我的 NSOperation 对象可能已被释放后调用,我是否需要确保在添加此操作之前在委托中保留 "element"排队?元素对象保留在应用程序的其他位置,但可能会在那里释放。我需要确保当我的委托从 NSOperation 收到它时,它仍然是一个有效的对象。

只是想知道在 dispatch_async 中调用它的行为是否会保留传递给它的参数。我当然可以使用 NSInvocation 和 performSelectorOnMainThread 来保留它。

队列在入队时会保留Block,Block会保留它捕获的对象,比如self。由于这里的 self 对其 element 有强引用,因此 element 将至少在 Block 运行之前有效。

请注意,对象对其委托具有强引用是不常见的:确保那里没有完整的保留周期。