我已将变量声明为 UIViewExtention 的子类。 我将项目非弧转换为弧
@interface SectionIconView : UIViewExtention
@property (nonatomic,weak) UIImageView *sectionPortraitImageView;
@property (nonatomic,weak) UIImageView *sectionLandscapeImageView;
我已将该属性声明为弱,然后在.m文件中显示错误,即。,
将保留对象分配给弱变量;对象将在赋值后释放。
我已将该属性更改为强..
@property (nonatomic,strong) UIImageView *sectionPortraitImageView;
然后它显示错误:
此块中强烈捕获可能会导致保留周期。
如何避免此错误?
答案 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
}