类块实例变量

时间:2012-05-02 02:43:20

标签: objective-c automatic-ref-counting objective-c-blocks

对于此代码的设计没有太多判断,我想知道如何解决我创建的保留周期......

@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;
}

1 个答案:

答案 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

这可以避免保留周期,因为返回的块会在执行后立即释放。