2016-10-29 82 views
0

在非ARC應用程序,我具有由委託入隊和看起來像一個的NSOperation亞類:dispatch_async和保留(非ARC)

// 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]]; 
    }); 
} 

由於[[自委託] doSomething的:[自元素]]將在我的NSOperation對象可能已被釋放後被調用,在將此操作添加到隊列之前,是否需要確保在委託中保留「元素」?元素對象保留在應用程序的其他地方,但可能會在那裏釋放。我需要確保當我的委託從NSOperation接收它時,它仍然是一個有效的對象。

想知道在dispatch_async中調用它的行爲是否會保留傳遞給它的參數。我當然可以使用NSInvocation和performSelectorOnMainThread來保留它。

+0

對不起 - 自己從init返回。我沒有添加到我的問題,但它在原代碼中。 – Trygve

+0

喬希是正確的(見下文)。請參閱[Objective-C Blocks](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW4)在_Blocks編程主題:塊和變量__ – Rob

回答

5

當隊列入隊時隊列將保留塊,並且塊將保留它捕獲的對象,如self。由於self這裏有一個強烈的參考elementelement將至少有效,直到塊運行後。

請注意,一個對象有一個強烈的參考代表是不尋常的:確保你沒有一個不間斷的保留週期。