2012-05-02 142 views
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; 
} 

回答

0

的问题是,你通过将其分配给伊娃而保留该块,并且由于该块被分配给伊娃,它需要保留自己 - 因此保留周期。

你可以通过一个实例方法返回块具有同等的行为:

@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 

这就避免了因为返回的块,只要它的执行公布的保留周期。

+0

是的。这绝对是有道理的。谢谢。 – edelaney05