2013-08-19 3 views
4

Я пытаюсь сохранить блок в переменной экземпляра в моем проекте. Вот где я объявляю переменную экземпляра:Блок, сохраненный как переменная экземпляра, становится nil

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

Я задаю переменную, вызвав этот метод:

- (void)requireLoggedInForBlock:(void (^)())completion { 
    self.loginCompletedTask = completion; 

    // Display an alert view that requires username and password input 
} 

После первой строки этого метода, self.loginCompletedTask не является нулевым и журналы в отладчик с типом NSMallocBlock. Однако, когда мне действительно нужно запустить блок после того, как будет возвращено представление предупреждения входа, оно стало нулевым.

Я пробовал:

  • Декларирование с strong вместо copy,
  • Установка в self.loginCompletedTask = ^{completion();};,
  • Установка переменной непосредственно, вместо того, чтобы использовать свойство (_loginCompletedTask = ...).

Что мне не хватает?

+0

И вы совершенно уверены, что объект, в котором вы нуждаетесьLogLoginInForBlock: к этому времени не был отменен() ed (просто установите NSLog в его dealloc() для проверки). –

+0

Да, потому что я регистрирую значение моего блока внутри этого объекта. Если это было нуль, ни один из этих кодов не запустится. Спасибо за ваш быстрый ответ. – aopsfan

+0

И вы не выделили новую копию своего объекта? –

ответ

1

Оказывается, это не имеет ничего общего с неправильным хранением блока. Я фактически создавал новый объект того же класса, что и тот, который хранил блок, но забыл скопировать его по фактическому блоку. Таким образом, методы, которые были удалены, которые вышли из значения self.loginCompletedBlock, были получены другим объектом, а не тем, с которого была назначена переменная.

Спасибо за вашу помощь, это всегда поражает меня, как SO-пользователи так охотно помогают.

1

Блоки - это единственные объекты (на сегодняшний день), созданные на стеке, а не куча. Если вы хотите сохранить блок дольше, чем срок службы фрейма стека, в котором он был создан, вы должны copy блок (копия основана на куче). Даже использование сильного указателя не остановит блокировку блока при выводе кадра стека.

ADDED: комментарии верны, достаточно иметь свойство копирования. Мой плохой, я забыл, что атрибут копирования был там.

+0

Моя собственность объявлена ​​как (неатомная, копия) - это достаточно для обеспечения копирования? – aopsfan

+1

Но это именно то, что '@property (..., copy)' уже делает. –

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