为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

忽然笑 2019-08-06 12:43:02
在实现API时,如何避免在块中捕获self?我有一个工作的应用程序,我正在努力将其转换为Xcode 4.2中的ARC。其中一个预检警告涉及self强烈捕获导致保留周期的块。我已经制作了一个简单的代码示例来说明问题。我相信我理解这意味着什么,但我不确定实现这种情况的“正确”或推荐方法。self是MyAPI类的一个实例下面的代码被简化为仅显示与我的问题相关的对象和块的交互假设MyAPI从远程源获取数据,MyDataProcessor处理该数据并生成输出处理器配置有块以通信进度和状态代码示例:// 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];问题:我在做什么“错误”和/或如何修改它以符合ARC惯例?
查看完整描述

3 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

当您肯定将来会破坏循环时,还可以选择禁止警告:

#pragma clang diagnostic push#pragma clang diagnostic ignored "-Warc-retain-cycles"self.progressBlock = ^(CGFloat percentComplete) {
    [self.delegate processingWithProgress:percentComplete];}#pragma clang diagnostic pop

这样你就不必四处寻找__weakself别名和明确的ivar前缀。


查看完整回答
反对 回复 2019-08-06
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

对于常见的解决方案,我在预编译头中定义了这些。避免捕获并仍然通过避免使用来启用编译器帮助id

#define BlockWeakObject(o) __typeof(o) __weak#define BlockWeakSelf BlockWeakObject(self)

然后在代码中你可以做:

BlockWeakSelf weakSelf = self;self.dataProcessor.completion = ^{
    [weakSelf.delegate myAPIDidFinish:weakSelf];
    weakSelf.dataProcessor = nil;};


查看完整回答
反对 回复 2019-08-06
  • 3 回答
  • 0 关注
  • 481 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信