在实现API时,如何避免在块中捕获self?

在实现API时,如何避免在块中捕获self?

我有一个工作的应用程序,我正在努力将其转换为Xcode 4.2中的ARC。其中一个预检警告涉及self强烈捕获导致保留周期的块。我已经制作了一个简单的代码示例来说明问题。我相信我理解这意味着什么,但我不确定实现这种情况的“正确”或推荐方法。


self是MyAPI类的一个实例

下面的代码被简化为仅显示与我的问题相关的对象和块的交互

假设MyAPI从远程源获取数据,MyDataProcessor处理该数据并生成输出

处理器配置有块以通信进度和状态

代码示例:


// code sample

self.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];

问题:我在做什么“错误”和/或如何修改它以符合ARC惯例?


忽然笑
浏览 482回答 3
3回答

慕姐4208626

当您肯定将来会破坏循环时,还可以选择禁止警告:#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前缀。

叮当猫咪

对于常见的解决方案,我在预编译头中定义了这些。避免捕获并仍然通过避免使用来启用编译器帮助id#define BlockWeakObject(o) __typeof(o) __weak#define BlockWeakSelf BlockWeakObject(self)然后在代码中你可以做:BlockWeakSelf weakSelf = self;self.dataProcessor.completion = ^{     [weakSelf.delegate myAPIDidFinish:weakSelf];     weakSelf.dataProcessor = nil;};
打开App,查看更多内容
随时随地看视频慕课网APP