2013-09-27 4 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"]; 

}; 

при слабом обращении сохраняют предупреждения цикла исчезли, но есть проблема, если я ввести внутри блока с nnstring, который должен быть выставиться

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"; 

}; 

Таким образом, я получаю ошибку «переменная не может быть назначен (отсутствует _ Тип блока МЭО)», поэтому я добавил„ _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? Как я могу сделать, чтобы установить значение переменной, установленной в .h моего viewController, без предупреждений и без выхода из блока?

ответ

2

Присвоить @"atext" к BlockString не установлено значение для моей первоначальной Astring переменной?

Нет, она не устанавливает Astring, и он не должен установить его: когда вы делаете это

NSString *__weak weakString=AString; 

создать вторую ссылку (что случается __weak) на объект, на который ссылается AString переменной (скажем, это @"some-text"):

Before

При установке weakString INSI де-блок для @"atext", вы повторно Направьте ссылку на другой объект, но объект @"some-text" остается, на который ссылается AString переменным:

After

Если вы хотите изменить AString переменными, установить его внутри блока , Если это ивар, используйте weakSelf->AString. Если он локальный, добавьте __block в его декларацию.

1

Предполагая, что aLabel и anArray являются Ивар контроллера зрения, вы на самом деле беспокоиться только о weakSelf, а затем ссылаться на любые Ивар и свойства там. И поскольку вы эффективно разыгрываете ivars, у вас тогда будет сильная ссылка внутри блока (потому что вы не можете разыменовать слабую переменную). Таким образом, если предположить, что aLabel, anArray, 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 (в частности, немного позже, где говорится о «нетривиальных циклах»).

Смежные вопросы