iPhone - есть ли способ узнать, является ли ссылка (все еще) действительной? - PullRequest
1 голос
/ 05 августа 2011

Допустим, я назначил экземпляр var с объектом, заданным в параметре. Я не знаю, что это за объект, поэтому я не хочу его сохранять. Но эта ссылка на этот объект может быть недействительной в какое-то время, например, если объект освобожден или собирается быть освобожденным (пул авто-выпуска). Итак, могу ли я узнать внутри экземпляра моего класса, можно ли использовать ссылку, хранящуюся в переменной экземпляра, без какого-либо риска сбоя?

Ответы [ 4 ]

2 голосов
/ 05 августа 2011

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

1 голос
/ 05 августа 2011

Крис Ван Баэль прав, независимо от того, знаете ли вы, что это за объект, если вы хотите владеть им (если вы сами должны гарантировать, что объект жив), вы должны сохранить его. Отпустите его, когда он вам не нужен, и установите ссылку на NIL (для безопасности).

Но их исключение !

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

Но в этом случае вам не нужно заботиться о том, чтобы делегат был освобожден: делегат должен установить для вашего свойства «делегата» значение nil в методе dealloc.

Итак

  • если у вас есть право собственности на объект: оставьте без выбора!
  • если объект принадлежит вам: назначайте и не волнуйтесь!
1 голос
/ 05 августа 2011

Такой подход действительно опасен.Если ваше приложение не может отслеживать жизненный цикл объекта, то вы должны изменить код, чтобы иметь возможность управлять этим.В любом случае, отвечая на ваш вопрос: вы можете защитить переменную вашего экземпляра, дополнительно сохранив ее в своем классе, а затем выпустив ее, когда она больше не нужна.Так что вам не нужно делать чек, который вы просите.

0 голосов
/ 05 августа 2011

Вы должны установить любую освобожденную ссылку на NIL и проверить на NIL.

...