我很難將一些NSOperation代碼轉換爲ARC。我的操作對象使用一個完成塊,它包含一個GCD塊,用於更新主線程上的UI。因爲我從它自己的完成塊中引用我的操作對象,所以我使用__weak指針來避免內存泄漏。但是,我的代碼運行時指針已經設置爲零。在自己的完成塊中引用一個NSOperation對象與ARC
我已經縮小到這個代碼示例。任何人都知道我錯了什麼地方,並且有正確的方法來完成這件事?
NSOperationSubclass *operation = [[NSOperationSubclass alloc] init];
__weak NSOperationSubclass *weakOperation = operation;
[operation setCompletionBlock:^{
dispatch_async(dispatch_get_main_queue(), ^{
// fails the check
NSAssert(weakOperation != nil, @"pointer is nil");
...
});
}];
那麼,錯誤的是一個弱指針不擁有所有權。如果沒有別的東西持有這個變量(並且沒有),它將被清除。如果你使用'operation',你確定會發生泄漏嗎?它看起來應該在完成塊被釋放時消失,它應該在它被調用後立即消失。 (雖然這可能是天真的。) – 2012-02-10 05:59:29
ARC在編譯時抱怨它。沒有它,我直接使用操作指針(並且我不相信我正在泄漏內存)。 – 2012-02-10 06:29:17
祝你好運。我認爲在放棄和做其他事情之前,我已經掙扎了好幾個小時。但已經有一段時間了。 :) – 2012-02-10 16:30:29