Я новичок в блокировании и при чтении через Интернет я обнаружил, что должен использовать слабые переменные для блоков, потому что блоки сохраняют переменные. Я немного путаюсь, используя 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
и когда пользователь ударил назад, сам будет еще один сильная ссылка внутри блока, пока объем не перебираться.
Пожалуйста, помогите мне понять, почему это происходит сбой? Почему мой сильный сам не держит объект.
Какая ошибка вы получаете? – NKorotkov
@NKorotkov strongSelf получает нуль, а блок не может '[strongSelf executeSomeThingElse]'. Сильный Self - сильный указатель на себя внутри блока, и он не должен получать nil до конца блока. Пожалуйста, дайте мне знать, если я ошибаюсь. –