Класс Objective-C без свойств? - PullRequest
1 голос
/ 06 апреля 2011

Я нахожусь в процессе просмотра некоторого кода в большом проекте, и я заметил, что в нескольких классах создаются переменные экземпляра, но не создаются соответствующие свойства (@property).

Это неправильно, создавать переменные экземпляра без свойств?Разве это не становится проблемой управления памятью?

На самом деле я никогда раньше не видел подобного кода, поэтому не уверен, что и думать на этом этапе.

Заранее спасибо!

Ответы [ 4 ]

1 голос
/ 06 апреля 2011

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

Некоторая история здесь может быть полезна:

В начале были только переменные экземпляра. «Свойства» существовали только неофициальным способом, по соглашению, для объектов вне вашего класса для доступа к «общедоступным» данным, предоставляемым классом. Вы бы написали свои собственные -(Foo *)foo и -(void)setFoo:(Foo *)f методы для каждого из них. Они часто походили на стандартный код, тривиально возвращая ивару в первом случае, и правильно сохраняя / освобождая / ставя танец в последнем.

Итак, появился Objective-C 2.0, который дал нам возможность объявлять свойства с помощью синтаксиса языка и даже генерировать для нас методы доступа - много времени и стандартного кода было сохранено.

Со временем некоторые люди начали думать о всех иварах как о «свойствах», публичных или частных. Общедоступные из них отображаются в файле .h как @properties, но вы также можете создать частный интерфейс для вашего объекта в файле .m, который объявляет ваш «приватный» @properties, так что вы можете использовать средства доступа внутри вашего класса. Это может быть или не быть излишним, в зависимости от вашей философии, но это, я думаю, имеет отношение к ситуации, которую вы видите сейчас, когда голые ивы выглядят подозрительно.

Они не должны. Переменные экземпляра счастливо существуют без какого-либо другого механизма. Просто получите право на сохранение / освобождение (в среде без GC).

Когда вы станете более продвинутым, см. Ответ @ bbum на этот вопрос: Должен ли каждый ивар быть собственностью? для некоторых университетских вещей, чтобы думать о преимуществах свойств вокруг KVO и подклассов.

1 голос
/ 06 апреля 2011

@ свойства являются просто сокращением - очень удобным сокращением - для кода, который вы можете написать самостоятельно, без всякого волшебства.

Может также случиться, что @properties объявлены в файле реализации внутрирасширение класса, и нет общедоступного API для прямой манипуляции с переменными экземпляра.

1 голос
/ 06 апреля 2011

Нет причин, по которым вам нужно использовать установщики / получатели стилей Objective-C 2 для управления переменными вашего экземпляра - до тех пор, пока переменная экземпляра освобождается в методе dealloc (если это действительно выделенный / инициализированный объект и т. Д.) тогда не о чем беспокоиться.

Имейте в виду, что до Objective-C таких свойств (и всего синтаксиса @property / @synthesize) просто не существовало, поэтому вам пришлось создатьваши собственные методы получения / установки, если вы сочтете это необходимым / удобным.

0 голосов
/ 06 апреля 2011

Свойства переменных экземпляра не являются обязательными.Фактически, до версии 2.0 Objective-C не было такого понятия, как свойства - вы должны были написать свои собственные методы доступа и мутаторы для переменных экземпляра (если вы хотели получить доступ к ним вне класса).Свойства могут упростить управление памятью, но, честно говоря, управление памятью в ivars не так сложно, и с ним не сложно справиться.

...