Поскольку сами переменные экземпляра могут быть синтезированы только в современной среде выполнения (и должны быть объявлены в @interface в 32-битном или до Leopard), самым безопасным / наиболее переносимым также является объявление ivar
- Должны ли мы использовать средства доступа к свойствам в init * и dealloc с Modern Runtime?
Мое эмпирическое правило «возможно» для -init*
и «обычно нет» для -dealloc
.
При инициализации объекта вы должны убедиться, что правильно копируете / сохраняете значения для иваров. Если метод установки свойства не имеет какого-либо побочного эффекта, который делает его неприемлемым для инициализации, определенно используйте абстракцию, предоставляемую свойством.
При освобождении объекта вы хотите освободить любые объекты ивара, но не хранить новые. Простой способ сделать это - установить для свойства значение nil (myObject.myIvar = nil
), которое в основном вызывает [myObject setMyIvar:nil]
. Поскольку сообщения на ноль игнорируются, в этом нет никакой опасности. Тем не менее, это слишком, когда [myIvar release]; это обычно все, что вам нужно. В общем, не используйте свойство (или непосредственно метод set) в ситуациях, когда освобождение должно вести себя иначе, чем установка переменной.
Я могу понять аргумент eJames против использования методов доступа к свойствам в init / dealloc, но с другой стороны, если вы измените поведение свойства (например, измените с сохранения на копирование или просто назначьте без сохранения) и не t использовать его в init, или наоборот, поведение также может быть не синхронизировано. Если инициализация и изменение ивара должны действовать одинаково, используйте метод доступа к свойствам для обоих.
- Если так, то чем это отличается? Это только потому, что компилятор не видит ivar?
Современная среда выполнения более разумно относится к размеру и разметке классов, поэтому вы можете изменять разметку ivars без необходимости перекомпиляции подклассов. Он также может вывести имя и тип нужного вам ивара по названию и типу соответствующего свойства. Руководство по программированию во время выполнения Objective-C 2.0 *1028* содержит больше информации, но, опять же, я не знаю, насколько подробно там объяснены детали.
- Если мне нужно переопределить метод доступа, могу ли я по-прежнему обращаться к тому iVar, который будет определен во время выполнения, или мне нужно определить фактический iVar, который затем будет использовать среда выполнения?
Я не проверял это, но я считаю, что вам разрешен доступ к названному ivar в коде, так как он действительно должен быть создан. Я не уверен, будет ли компилятор жаловаться, но я предполагаю, что, поскольку он позволит вам синтезировать ивар без каких-либо жалоб, он также достаточно умен, чтобы знать о синтезированном иваре и позволяет вам ссылаться на него по имени.
- Опять же, если я могу получить доступ к синтезированному iVar, почему я не могу продолжать делать это для методов init * и dealloc?
Вы должны иметь доступ к свойству и / или ivar в любое время после выделения экземпляра.