2013-09-27 96 views
2

爲了避免保留週期和警告「在此塊強烈捕捉自我很可能會導致保留週期」我在我的塊中添加一些爲每個對象這樣無__block變量設置一個NSString的

MyViewController *__weak weakSelf= self; 
NSMutableArray *__weak weakArray=AnArray; 
UILabel *__weak weakLabel=ALabel; 

///the block code with some examples 
up2.completionBlock = ^(NSDictionary *headers, NSString *responseString) { 

     [weakSelf aMethodInTheController]; 
     [weakLabel setHidden:NO]; 
     [weakArray addObject:@"something"]; 

}; 

與弱引用保留週期警告消失了,但是有,如果我的塊中引入了必須設置好的

MyViewController *__weak weakSelf= self; 
NSMutableArray *__weak weakArray=AnArray; 
UILabel *__weak weakLabel=ALabel; 

NSString *__weak weakString=AString; 

///the block code with some examples 
up2.completionBlock = ^(NSDictionary *headers, NSString *responseString) { 

    [weakSelf aMethodInTheController]; 
    [weakLabel setHidden:NO]; 
    [weakArray addObject:@"something"]; 
    [email protected]"atext"; 

}; 

這樣,我又收到錯誤nnstring問題「變量不分配(失蹤_ 塊類型指定IER)」,所以我必須添加‘ _block’

MyViewController *__weak weakSelf= self; 
NSMutableArray *__weak weakArray=AnArray; 
UILabel *__weak weakLabel=ALabel; 

NSString *__weak weakString=AString; 
__block NSString *BlockString = weakString;  

///the block code with some examples 
up2.completionBlock = ^(NSDictionary *headers, NSString *responseString) { 

[weakSelf aMethodInTheController]; 
[weakLabel setHidden:NO]; 
[weakArray addObject:@"something"]; 
[email protected]"atext"; 

}; 

這樣一切似乎正常工作,至少要等到我是塊裏面......我原來ASTRING變量在.H定義我的viewController,我不得不訪問它的價值之後和塊外,但它的價值永遠是零。將@「atext」分配給BlockString不要爲我的原始Astring變量設置一個值?我怎麼能設置一個變量的值設置在我的viewController的.h沒有收到警告和沒有退出塊?

回答

2

指定@"atext"到​​不要設置一個值到我原來的Astring變量嗎?

不,它不設置Astring,它不應該設置它:當你做這個

NSString *__weak weakString=AString; 

創建第二個引用(恰好是__weak)被引用的對象在AString變量(比如,它的@"some-text"):

Before

當您設置weakString INSI德塊到@"atext",你再點所指的是一個不同的對象,但@"some-text"對象仍然由AString變量引用:

After

如果你想改變AString變量,將它設置你的塊內。如果是伊娃,請使用weakSelf->AString。如果是本地,則在其聲明中添加__block

1

假設aLabelanArray是視圖控制器的ivars,你真的只是擔心weakSelf,然後從那裏引用任何ivars和屬性。而且,由於您有效地解除了引用ivars的作用,因此您可以在該塊內部引用強引用(因爲您無法解引用弱變量)。因此,假設aLabelanArray,一個aString是高德:

MyViewController *__weak weakSelf = self; 

///the block code with some examples 
up2.completionBlock = ^(NSDictionary *headers, NSString *responseString) { 

    MyViewController *strongSelf = weakSelf; 
    if (strongSelf) { 
     [strongSelf aMethodInTheController]; 
     [strongSelf->aLabel setHidden:NO]; 
     [strongSelf->anArray addObject:@"something"]; 
     strongSelf->aString = @"something else"; 
    } 
}; 

坦率地說,我不提領高德的粉絲,我寧願使用(有許多原因)性能。但都工作。

有關此模式的示例,請參閱Transitioning To ARC Release Notes的「使用壽命限定符以避免強參考週期」部分(特別是稍後討論「非平凡週期」的部分)。