2012-05-02 182 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