对于此代码的设计没有太多判断,我想知道如何解决我创建的保留周期......
@interface BlockClass : NSObject
{
id actualObject;
NSError *actualError;
void (^block)(id, NSError *);
}
@end
@implementation BlockClass
- (id)init
{
self = [super init];
if (self) {
block = ^(id object, NSError *error){
actualObject = object; // Compiler warns: capturing 'self' strongly in this block is likely lead to a retain cycle
actualError = error;
};
}
return self;
}
答案 0 :(得分:0)
问题是你通过将它分配给一个ivar来保留该块,并且由于该块分配给一个ivar,它需要保留self - 因此保留周期。
您可以通过从实例方法返回块来获得等效行为:
@interface BlockClass : NSObject
{
id actualObject;
NSError *actualError;
}
@end
@implementation BlockClass
- (id)init
{
self = [super init];
if (self) {
}
return self;
}
-(void (^)(id, NSError *))block {
return ^(id object, NSError *error){
actualObject = object;
actualError = error;
};
}
@end
这可以避免保留周期,因为返回的块会在执行后立即释放。