2011-02-06 2 views
2

Хотя это несколько очень простой вопрос, но у меня есть некоторые сомнения, которые остались после чтения так много документов и вопросов на 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 

} 

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

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

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

Просьба предложить. Спасибо заранее.

ответ

1

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

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

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

2) Вы хотите автоматически генерировать аксессоров

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

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

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

4) строже соответствующий селектор с дот-синтаксисе

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

5), чтобы заставить подклассы использовать их вместо обращения с Ивар непосредственно

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

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

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

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

+0

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

+0

@ Киара, пожалуйста. конечно - с этим разъяснением, я думаю, вас больше всего интересует, как получить доступ и установить ваши переменные экземпляра, учитывая контекст в вашем примере viewDidLoad. ('@property (nonatomic, keep) UIButton * btn;' <- эта строка является объявлением свойства). Ответ: поскольку 1) подклассы могут получить доступ к вашим ivars 2) предоставленная вами реализация явно не является потокобезопасной 3) существуют публичные геттеры и сеттеры 4) 'viewDidLoad' использует полностью построенный экземпляр класса (продолжение) – justin

+0

(продолжение) 5) вы не используете частично разрушенный экземпляр 6) метод переопределен и может быть переопределен - я бы получил доступ к свойствам в этом случае – justin

3

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

Смежные вопросы