在實(shí)現(xiàn)API時(shí),如何避免在塊中捕獲self?我有一個(gè)工作的應(yīng)用程序,我正在努力將其轉(zhuǎn)換為Xcode 4.2中的ARC。其中一個(gè)預(yù)檢警告涉及self強(qiáng)烈捕獲導(dǎo)致保留周期的塊。我已經(jīng)制作了一個(gè)簡(jiǎn)單的代碼示例來說明問題。我相信我理解這意味著什么,但我不確定實(shí)現(xiàn)這種情況的“正確”或推薦方法。self是MyAPI類的一個(gè)實(shí)例下面的代碼被簡(jiǎn)化為僅顯示與我的問題相關(guān)的對(duì)象和塊的交互假設(shè)MyAPI從遠(yuǎn)程源獲取數(shù)據(jù),MyDataProcessor處理該數(shù)據(jù)并生成輸出處理器配置有塊以通信進(jìn)度和狀態(tài)代碼示例:// code sampleself.delegate = aDelegate;self.dataProcessor = [[MyDataProcessor alloc] init];self.dataProcessor.progress = ^(CGFloat percentComplete) { [self.delegate myAPI:self isProcessingWithProgress:percentComplete];};self.dataProcessor.completion = ^{ [self.delegate myAPIDidFinish:self]; self.dataProcessor = nil;};// start the processor - processing happens asynchronously and the processor is released in the completion block[self.dataProcessor startProcessing];問題:我在做什么“錯(cuò)誤”和/或如何修改它以符合ARC慣例?
3 回答

慕姐4208626
TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個(gè)贊
當(dāng)您肯定將來會(huì)破壞循環(huán)時(shí),還可以選擇禁止警告:
#pragma clang diagnostic push#pragma clang diagnostic ignored "-Warc-retain-cycles"self.progressBlock = ^(CGFloat percentComplete) { [self.delegate processingWithProgress:percentComplete];}#pragma clang diagnostic pop
這樣你就不必四處尋找__weak
,self
別名和明確的ivar前綴。

叮當(dāng)貓咪
TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
對(duì)于常見的解決方案,我在預(yù)編譯頭中定義了這些。避免捕獲并仍然通過避免使用來啟用編譯器幫助id
#define BlockWeakObject(o) __typeof(o) __weak#define BlockWeakSelf BlockWeakObject(self)
然后在代碼中你可以做:
BlockWeakSelf weakSelf = self;self.dataProcessor.completion = ^{ [weakSelf.delegate myAPIDidFinish:weakSelf]; weakSelf.dataProcessor = nil;};
- 3 回答
- 0 關(guān)注
- 505 瀏覽
添加回答
舉報(bào)
0/150
提交
取消