2011-06-05 76 views
1

NSOperation在主線程中有一個委託,它調用NSOperation運行時發生的一些事件。從主線程訪問NSOperation對象的安全方法?

Delegate然後訪問NSOperation的屬性以獲取詳細信息。

我很關心這個邊緣情況:如果NSOperation在隊列調用委託之後被納秒釋放,該怎麼辦?我擔心突然間所有的對象都會因NSOperation的-dealloc釋放而消失,然後我在主線程上得到一個EXC_BAD_ACCESS。

你如何預防這種情況?我想過做的NSOperation內像這樣它在後臺運行:

[(NSObject*)self.delegate performSelectorOnMainThread:@selector(operationUpdatedStatus:) withObject:[[self retain] autorelease] waitUntilDone:NO]; 

但我認爲這是無稽之談,因爲自動釋放池也被立即倒掉,因爲它是本地的NSOperation。

所以可以肯定的是,我必須像這樣在Main Thread的委託方法中保留NSOperation嗎?

- (void)operationUpdatedStatus:(NSOperation*)op { 
    [op retain]; // now we're safe to use it 

    NSMutableArray *errorMessages = op.errors; 
    for (NSString *errorMessage in errorMessages) { 
     // lots of code 
    } 

    [op release]; 
} 

還是保證NSOperation對象不會被殺死,直到主線程的運行循環結束?

回答

1

根據the NSObject docsperformSelectorOnMainThread保留選擇器目標以及通過withObject傳遞的對象;直到要執行的選擇器完成後纔會釋放。所以你的[[self retain] autorelease]有多餘。

1

我現在在做NSOperation中非常類似的編碼。我將操作添加到隊列中,但由於我知道操作很快就會結束,因此我通過委託中的對象將所需的任何值傳遞迴調用類。大多數情況下,如果超過1個對象,我會使用NSDictionary來執行此操作。我從來沒有使用這種方法解除分配實例的問題。