簡體   English   中英

帶塊的ARC和保留循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM