[英]ARC with blocks and retain cycles
我有一個類,它將一個塊作為對象屬性:
@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(error)',編譯器不會給我任何警告!
任何人都可以向我解釋發生了什么事嗎? 我必須嚴肅地忽略ARC內存管理規則中的一些內容,但我無法弄明白。
當你在操作塊中引用“failureBlock”時,你實際上正在做“self-> failureBlock” - 所以它隱含地保留了self。 你可以做的是創建一個自動變量SFFailureBlock xFailureBlock = failureBlock; 在自我操作之上,然后在塊中使用它。 [再次,你想避免任何自我>參考INSIDE阻止。]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.