Почему все это свойство в учебниках iOS SDK? - PullRequest
2 голосов
/ 30 ноября 2010

В большинстве учебных пособий по iOS SDK, которые я читал в Интернете как от Apple, так и от других источников, многие переменные экземпляра становятся свойствами, даже когда к ним обращаются только из своего собственного класса.

Например, в последнем iOS SDK Facebook пользователю предлагается сохранить экземпляр класса Facebook под названием facebook в делегате приложения.facebook" является собственностью.Это затем упоминается во всем примере кода как «self.facebook».Но свойство «facebook» нигде не упоминается за пределами делегата приложения.

Почему это так?Что мне не хватает?Если переменная экземпляра используется только в своем собственном классе, я склоняюсь к , а не , чтобы сделать его свойством, чтобы оно не было общедоступным, и ссылаться на него просто как facebook, а не self.facebookили self->facebook изнутри класса.

Честно говоря, даже если бы мне понадобилось свойство facebook, я думаю, что я бы скорее назвал его в делегате приложения просто "facebook", а не "self.facebook".

Так что же дает?Почему я везде вижу недвижимость?

Ответы [ 6 ]

7 голосов
/ 01 декабря 2010

Свойства не имеют никакого отношения к тому, открыт ли iVar или нет. Вместо этого свойства создают методы доступа, которые управляют хранением и способствуют инкапсуляции.

Если вам нужно личное свойство, просто объявите ivar в директиве @private, а затем определите свойства в файле реализации.

4 голосов
/ 01 декабря 2010

Один прекрасный пример того, почему вы должны использовать свойства (вы можете сделать свойства частными, как отметил TechZen), - это создание новых экземпляров в viewDidLoad.

Люди делают это постоянно, потому что он вызывается один раз за экземпляр контроллера представления. Или, как вы думаете ... в действительности из-за того, что происходит, когда ваше приложение получает предупреждение о памяти, класс viewDidLoad может вызываться несколько раз за экземпляр.

Так, например, вы можете написать код вроде:

- (void) viewDidLoad
{ myArray = [[NSMutableArray alloc] init]; }

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

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

- (void) viewDidLoad
{ self.myArray = [NSMutableArray array]; }

Теперь вы не можете понять это неправильно. Если viewDidLoad вызывается несколько раз, старый массив освобождается, а новый заменяет его без утечки старого.

3 голосов
/ 30 ноября 2010

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

Могут быть некоторые различия / недостатки эффективности, но это зависит от конкретного ObjCвремя выполнения используется.

3 голосов
/ 30 ноября 2010

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

1 голос
/ 30 ноября 2010

если вы ссылаетесь на facebook, то он будет обращаться к переменной напрямую, если вы обращаетесь к self.facebook, то он будет проходить через методы setter / getter.

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

0 голосов
/ 30 ноября 2010

Создает для вас геттер / сеттер автоматически.Кроме того, вот хороший пост, объясняющий это properties

...