2013-02-19 3 views
6

У меня есть @class Foo, который содержит __weak id bar ivar. Несколько действий от методов в разных классах могут привести к исчезновению объекта и, таким образом, получить bar niled.Хотите выполнить действие, когда __weak ivar заштрихован

Я хочу выполнить действие, когда ивар автоматически закроется ARC.

Если возможно, я бы хотел избежать поворота bar в собственность или с помощью наблюдения за ключевыми значениями.

Возможно ли это? Если нет, может ли KVO использоваться против не-имущественных иваров?

+0

В соглашении говорится, что вы должны называть его __weak id bar. Вы знаете, какой класс является этой переменной? Вы можете справиться с этим в методе dealloc. –

+0

Ramy: Да, я виноват, я исправил его в вопросе (его фактическое имя начиналось с нижнего регистра). Что касается 'dealloc', если возможно, я также хотел бы избежать использования' dealloc' метода 'bar'. Я хотел бы вызвать это действие в '@class Foo'. –

+0

Я думаю, вы хотите слишком много. –

ответ

2

KVO не может быть успешно использован на неимущественных IVAR.

Вы не можете обнаружить из среды выполнения, когда ARC Objective-C nils IVAR.

0

Предлагаю переопределить dealloc. Если вы знаете тип объекта, который будет выделен, и это пользовательский класс (в противном случае его подкласс), вы можете выполнить действие, когда объект будет освобожден, что и происходит, когда ARC устанавливает значение удержания в ноль и устанавливает слабая переменная до нуля.

+0

Я соглашусь на это, если не будет выведен метод без использования KVO. Ура! –

+1

Хм, я пробовал это, и метод '- (void) observValueForKeyPath: ...' не запускается, даже если «bar» устанавливается ARC (nil) (я контролирую его, и я вижу, что это установлен на ноль). В документации, по-видимому, указано, что она работает только для свойств. Вы уверены, что это работает для иваров? –

+1

Хорошо, при дальнейшем тестировании '- (void) observValueForKeyPath: ...' запускается, если я устанавливаю ivar, выполняющий '[self setValue: object forKey: @" bar "]', но он не срабатывает, если я устанавливаю он делает 'bar = object'. В любом случае, это также не срабатывает, когда ARC устанавливает его в нуль, и это то, что я ищу. –

4

я привел здесь дубликата вопрос, вот что я ответил:

Вы не можете сделать это с КВО, но вы можете получить уведомление и эмулировать, связав объект с помощью Ивар objc_setAssociatedObject(), он будет освобожден при слабой переменной.

Вы можете построить на вершине, что очень сложные уведомителями, используя NSNotificationCenter или просто пользовательские блоки, в зависимости от того, насколько сильно вы полагаетесь на том, что для конкретного случая или Ивар для многих из них.

Хорошая вещь об этом решении заключается в том, что он работает с любым изivar, даже если вы не контролируете тип __weak ivar.

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

  • Нет связанных вопросов^_^