зачем объявлять некоторые переменные экземпляра как свойства - PullRequest
2 голосов
/ 06 февраля 2011

Хотя это довольно простой вопрос, но у меня остались некоторые сомнения после прочтения такого количества документов и вопросов на stackoverflow.com.

Я хочу знать, почему объявлять некоторые переменные экземпляра в качестве свойств.

MYViewController.h
   @interface MyViewController : UIViewController {
        UIButton *btn;
        NSString *name;
    }
    @property (nonatomic, retain) UIButton *btn;
    @property (nonatomic, retain) NSString *name;

MyViewController.m
   @implementation MyViewController
   @synthesize btn;

-(void) viewDidLoad()
{
   [btn setTitle:@"Hello" forState:UIControlstaeNormal]; //this is first way where there is no need to declare btn as property

   [self.btn setTitle:@"Hello" forState:UIControlstaeNormal]; //this is second way where we do need to decalre btn as property as we are accessing it through self 


//Setting value of name

  name = @"abc"; //this is first way where there is no need to declare name as property 
  [self setName:@"abc"; //this is second way where we do need to declare name as property as we are accessing its aetter method through self

}

Теперь в приведенном выше коде я хочу знать, когда мы можем использовать методы getter / setter для переменной btn, не объявляя ее как свойство, тогда зачем нужно объявлять ее как свойство, и какой способ лучшеустановить значение «имя».

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

По сути, я немного запутался, в каких ситуациях объявлять переменные экземпляра как свойства.

Пожалуйста, предложите.Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 06 февраля 2011

Короче говоря, вам не нужно объявлять переменные экземпляра как свойства, если вы этого не хотите. Вы объявляете переменную как свойство, чтобы автоматически генерировать методы получения и установки. В декларации вашего свойства вы можете указать, как вы хотите, чтобы они настраивались (сохранить против присвоения, атомарный против неатомного). Затем getter и setter генерируются с помощью директивы @synthesize. Итак, опять же, нет правильного или неправильного способа использования свойств. Некоторые люди никогда не используют их, некоторые люди делают каждую переменную свойством. Это действительно зависит от вас.

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

как правило, вы будете использовать их, потому что:

1) свойство принадлежит к общедоступному интерфейсу класса

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

2) вы хотите автоматически сгенерированные средства доступа

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

3) документировать поведение

иногда лучше написать @property (copy) NSString * title;, чем перезаписывать ожидаемый результат.

4) более строгое соответствие селектора с точечным синтаксисом

компилятор выполняет более строгое сопоставление селектора. Предпочитаю по возможности перехватывать ошибки / проблемы при компиляции.

5) заставить подклассы использовать их вместо непосредственной обработки иваров

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

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

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

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

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