1

Я новичок в блокировании и при чтении через Интернет я обнаружил, что должен использовать слабые переменные для блоков, потому что блоки сохраняют переменные. Я немного путаюсь, используя self с блоками. давайте возьмем пример:__weak и сильное поведение переменных с блоками

@interface ViewController : UIViewController 

@property (copy, nonatomic) void (^cyclicSelf1)(); 

-(IBAction)refferingSelf:(id)sender; 
-(void)doSomethingLarge; 
@end 

Здесь у меня есть ViewController, и он объявил свойство блока с атрибутом копирования. Я не хочу, чтобы сохранить цикл, так что я знаю, используя себя в блоке Мне нужно создать слабый объект самостоятельно, например:

__weak typeof(self) weakSelf = self; 

То, что я хочу, чтобы убедиться, что мой блок выполняется на фоновом потоке и может быть поражен пользователь, прежде чем он закончит. Мой блок выполняет какую-то важную задачу, и я не хочу, чтобы это потеряло. Поэтому мне нужно до конца блока. Я следующий в моем файле реализации:

-(IBAction)refferingSelf:(id)sender 
{ 
    __weak typeof(self) weakSelf = self; // Weak reference of block 

    self.cyclicSelf1 = ^{ 

     //Strong reference to weak self to keep it till the end of block 
     typeof(weakSelf) strongSelf = weakSelf;  
     if(strongSelf){ 
      [strongSelf longRunningTask];//This takes about 8-10 seconds, Mean while I pop the view controller 
     } 
     [strongSelf executeSomeThingElse]; //strongSelf get nil here 
    }; 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), self.cyclicSelf1); 
} 

По мне, с помощью typeof(weakSelf) strongSelf = weakSelf; должен создать сильную ссылку на моем self и когда пользователь ударил назад, сам будет еще один сильная ссылка внутри блока, пока объем не перебираться.

Пожалуйста, помогите мне понять, почему это происходит сбой? Почему мой сильный сам не держит объект.

+0

Какая ошибка вы получаете? – NKorotkov

+0

@NKorotkov strongSelf получает нуль, а блок не может '[strongSelf executeSomeThingElse]'. Сильный Self - сильный указатель на себя внутри блока, и он не должен получать nil до конца блока. Пожалуйста, дайте мне знать, если я ошибаюсь. –

ответ

3

Ваша рекомендация не является сильной. Просто добавьте __strong директиву так:

__strong typeof(weakSelf) strongSelf = weakSelf; 
+0

Это не будет иметь никакого значения, так как по умолчанию объекты имеют сильный тип, пока вы явно не укажете __weak. –

+0

Не имеет значения, ссылки по умолчанию значительны. – NKorotkov

+0

@ KapilChoubisa ты это пробовал? – LDNZh

2

Я нашел ответ. Мне было очень любопытно, потому что ваш код казался мне законным. По крайней мере, идея. Поэтому я создал подобный проект и немного экспериментировал. Проблема эта линия:

typeof(weakSelf) strongSelf = weakSelf; 

Изменить его либо

__strong typeof(weakSelf) strongSelf = weakSelf; 

как предложено @LDNZh или

typeof(self) strongSelf = weakSelf; 

И ваш код будет работать.

ОБНОВЛЕНИЕ: Поскольку этот вопрос проявляется много, я внесла некоторые изменения в свой примерный проект. Я делаю это доступным по адресу github для всех, для дальнейшего использования.

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