暂时只能想到两种,以后有想法了继续补充。
循环引用的概念就不讲了,这里只是讲讲在block中解除的方法。
第一种当然是使用<code>weak</code>了
此处主要记录第二种。直接在block中传入有可能引起循环引用的值作为参数,比如:
@class XXXSelfContrainSelf;
typedef void(^Test)();
@interface XXXSelfContrainSelf : NSObject
@property (nonatomic, strong) Test block;
- (void)test;
@end
@implementation XXXSelfContrainSelf
- (void)test {
if (self.block) {
self.block();
}
}
- (void)dealloc {
NSLog(@"11111");
}
@end
如果再调用的时候这样子调用就会引起循环引用,从而内存泄漏
XXXSelfContrainSelf *obj = [XXXSelfContrainSelf new];
obj.block = ^(){
[obj class];
};
这个时候只要做一下小修改
typedef void(^Test)(XXXSelfContrainSelf *);
然后这样子调用,就解决了
XXXSelfContrainSelf *obj = [XXXSelfContrainSelf new];
obj.block = ^(XXXSelfContrainSelf *wSelf){
[wSelf class];
};
跟人讨论时候,别说城投机取巧的方式,,我倒是觉得,如果只有一个变量引起循环引用,这种方式才是更好的,因为方便修改,方便测试!
还有一种方式在block调用完成之后,清空block,比如开源库 <code>PSTAlertController</code>中的<code>PSTAlertAction</code>
- (void)performAction {
if (self.handler) {
self.handler(self);
self.handler = nil; // nil out after calling to break cycles.
}
}