1

我有其保持塊作爲對象屬性的類:ARC與塊和保持週期

@property (nonatomic, readwrite, copy) SFFailureBlock failureBlock; 

其中SFFailureBlock:

typedef void (^SFFailureBlock)(NSError *error); 

我已經操作也宣告作爲對象屬性( AFHTTPRequestOperation),我希望它在完成後調用失敗塊。

[self.operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    __weak NSError *error = [NSError errorWithDomain:@"com.test" code:100 userInfo:@{@"description": @"zero results"}]; 
    failureBlock(error); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"nothing"); 
}]; 

我得到一個編譯器警告「捕獲‘自我’強烈該塊很可能會導致保留週期」。我搜索了互聯網,但我找不到一個體面的解決方案,爲什麼這會導致保留週期。我並不是在任何地方在街區內調用「自我」。

另一個奇怪的是,如果我寫'self.failureBlock(錯誤)'編譯器不給我任何警告!

任何人都可以向我解釋發生了什麼事嗎?我必須認真思考ARC內存管理規則中的某些內容,但我無法弄清楚。

回答

4

當您在操作塊中引用「failureBlock」時,您確實在執行「self-> failureBlock」 - 因此它隱含地保留了自我。你可以做的是創建一個自動變量SFFailureBlock xFailureBlock = failureBlock;在自我操作之上,然後在塊中使用它。 [再一次,你想避免任何自我引用INSIDE阻止]

+1

除非我誤解了,否則在示例__weak或__unsafe_unretained中創建xFailureBlock也可能是一個好主意。 – 2012-07-28 02:06:38

+0

我相信但不知道xFailure auto var for failure塊會複製塊(然後由封閉塊捕獲)。 – 2012-07-28 12:55:53

+0

我明白了。但是,不是failureblock是控制器的實例屬性嗎?我認爲一般情況下,當我們做一些像「[self.myarray addObject:anObject];」在一個塊內,「myArray」不會被保留。我錯了嗎? – csotiriou 2012-07-29 15:07:49