在块中强烈捕获属性,将app non arc转换为arc

时间:2014-12-16 06:46:48

标签: ios objective-c uiimageview objective-c-blocks

我已将变量声明为 UIViewExtention 的子类。 我将项目非弧转换为弧

@interface SectionIconView : UIViewExtention 
@property (nonatomic,weak)  UIImageView *sectionPortraitImageView;
@property (nonatomic,weak)  UIImageView *sectionLandscapeImageView;

我已将该属性声明为弱,然后在.m文件中显示错误,即。,

  

将保留对象分配给弱变量;对象将在赋值后释放。

我已将该属性更改为强..

@property (nonatomic,strong)  UIImageView *sectionPortraitImageView;

然后它显示错误:

  

此块中强烈捕获可能会导致保留周期。

如何避免此错误?

1 个答案:

答案 0 :(得分:2)

请参阅this Apple documentation,了解如何避免捕获" self"强烈地在一个街区。这是关键部分:

XYZBlockKeeper * __weak weakSelf = self;
self.block = ^{
    [weakSelf doSomething];   // capture the weak reference
                              // to avoid the reference cycle
}

如果您需要访问块内的ivars,则需要以下附加模式

self.block = ^{
    XYZBlockKeeper * strongSelf = weakSelf;
    // can now access strongSelf->myIvar safely
}

您可能认为可以使用weakSelf-> myIvar但这会导致另一个关于竞争条件的警告。上面的代码还将确保在块运行时自我保持活跃,即使您不访问ivars也可能需要这样做。

最后,如果您的代码可以实现,您可能会考虑不捕获自己,只需捕获您需要的内容,这可以避免很多这种复杂性:

MyClass *myThing = self.myThing;
self.block = ^{
    // use myThing here, self is not captured
}