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 に答える