Локальные переменные и переменные-члены в Objective-C - PullRequest
1 голос
/ 09 марта 2012

В настоящее время я изучаю управление памятью и свойства в Objective-C.Недавно я прочитал этот пост и ответы на мой предыдущий вопрос о том, как @property и @synthesize работают в Objective-C.Это кое-что прояснило.

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

Если у меня есть:

@interface FooClass : NSObject {
     NSObject *bar_;    
}

зачем мне нужно создавать свойство?Я имею в виду, я понимаю, что свойство создает геттеры и сеттеры, но что с того?У меня есть переменная экземпляра bar_, которую я могу установить с помощью foo.bar_ = newObject;.Какие преимущества дает мне свойство bar, а затем установка bar_ с использованием foo.bar = newObject?

Ответы [ 3 ]

1 голос
/ 09 марта 2012

Прежде всего, для доступа к переменной экземпляра, которую вы не можете использовать

foo.bar_ = newObject;

, вам нужно использовать

foo->bar_ = newObject;

(конечно, bar_ i-var должен быть объявленкак публичный, если вы не хотите получать ошибку компилятора- это приведет к увеличению сложности кода.

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

Но основная причиназдесь, если вы не знакомы с принципами ООП - абстракция.Пользователи вашего класса не должны знать, как ваш класс реализован внутри, иначе вы получите слишком много жестких зависимостей в вашем коде.И будет действительно сложно что-то выделять, обновлять или поддерживать.

0 голосов
/ 09 марта 2012

Getter / Setters инкапсулируют ivars и заботятся об управлении памятью, параллельном доступе (не атомарный ..) и т. Д. Такие вещи, как KVO, зависят от соглашений, таких как getter / setters.

0 голосов
/ 09 марта 2012

Вы не можете установить bar_, используя foo.bar_, не создавая установщик, потому что в Objective-C синтаксис точки на самом деле вызывает метод установщика.

Кроме того, обычно bar_ это личное, поэтому выне может получить к нему доступ непосредственно за пределами вашего класса.

При создании свойства автоматически создаются методы получения / установки;кроме того, он позаботится и о проблемах с памятью (в соответствии с параметрами, указанными при создании свойства, такими как сохранение, копирование, назначение и т. д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...