0

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

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

1 回答 1

0

问题是您通过将块分配给 ivar 来保留块,并且由于块分配给 ivar,它需要保留自身 - 因此保留循环。

您可以通过从实例方法返回块来获得等效的行为:

@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

这避免了保留周期,因为返回的块一执行就被释放。

于 2012-05-03T04:57:20.170 回答