【问题标题】:Class Block Instance Variable类块实例变量
【发布时间】:2012-05-02 02:43:19
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    问题是您通过将块分配给 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
    

    这避免了保留循环,因为返回的块在执行后立即释放。

    【讨论】:

    • 是的。这绝对是有道理的。谢谢。
    猜你喜欢
    • 2014-09-21
    • 1970-01-01
    • 2015-04-26
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2012-01-31
    • 2017-12-27
    相关资源
    最近更新 更多