2013-03-19 5 views
1

Должен ли я лучше всегда записиДолжны ли выходы иметь приемники/сеттеры?

@interface MyClass 
    { 
     NSTextField * myTextField ; 
    } 
    @property (assign) NSTextField * myTextField ; 

или просто

@interface MyClass 
    { 
     NSTextField * myTextField ; 
    } 

?

Почему у меня есть основания думать, что мы должны добавить @property строку:

  • Недавно у меня была программа, которая не будет работать, если на выходе не было геттер/сеттер.

  • Plus: мы нашли следующую строку, когда проект создан

    @property (assign) IBOutlet NSWindow *window; 
    
+1

IBOutlets применимы только к объектам. Очень мало нужно использовать iVars в заголовке вашего класса, либо поместите его в расширение класса, либо в свою @implementation. –

+0

Можете уточнить свой отзыв, пожалуйста? Что такое iVar? Плюс: мне всегда говорили/показывали, чтобы объявить атрибуты класса в '.h'. Вы только имеете в виду, что если есть свойство @, то мне не нужно объявлять атрибут раньше? – Colas

+0

@ RichardJ.RossIII, в то время как я nitpicking, ваше первое предложение неверно. IBOutlets можно использовать для украшения переменной экземпляра, даже без соответствующего '@ property'. Это был обычный (единственный) способ сделать что-то в pre-Objective-C 2.0 и все еще работает. 100% согласны с вашим вторым предложением. –

ответ

1

Все, что вам нужно, это свойство для Interface Builder с использованием IBOutlet. Если вы не используете Interface Builder, вам не нужен IBOutlet. Если вы не используете Interface Builder, вам может даже не понадобиться свойство вообще (свойства обычно общедоступны, а переменные экземпляра всегда являются частными).

@interface MyClass : UIViewController 

@property (assign) IBOutlet NSTextField *myTextField ; 

Вам не нужно создавать переменную экземпляра или синтезировать ее как выполненную для вас.

Вы можете получить к нему доступ с self.myTextField в своем коде.

+0

Итак, что же использовать '@ synthetize'? – Colas

+1

'@ synhesize' используется для автоматического создания геттеров/сеттеров для ваших свойств. Сам был ярлыком. Но теперь '@ synhesize' автоматически включается для ваших свойств с Xcode 4.4 –

+3

Переменные экземпляра не всегда являются частными. Они по умолчанию закрыты, но могут быть обнародованы или защищены. –

3

Как только вы создаете property для объекта выпускного или любого другого объекта, то Ивар создается для него (в новые компиляторы).

Теперь создание иваров и свойств устарело. Даже property сочетаются с автосинтезами.

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

Если выпускной имеет сеттер/геттер

Да, действительно вам нужно получить доступ к ним много раз. Как проверить состояние кнопки радио, флажок, установка stringValue является NSTextField, перезарядка таблицы [Tableview reloadData] и т.д.

@interface MyClass 
    { 
     NSTextField * myTextField ; //this is ivar 
    } 
    @property (assign) NSTextField * myTextField ; //this is property 
@end 

Все, что вы положили в .h является public и доступен, если вы хотите, чтобы сделать его скрытым делать это в .m даже в пределах расширения.

+0

Что вы подразумеваете под «Even свойство создает автосинтезирующие объекты». ? – Colas

+0

Я думал, что нам нужно создать iVars в '.h'? Это то, что вы говорите по-новому? (Я новичок) – Colas

+0

@Colas: проверьте мой отредактированный ответ, и вы можете воспользоваться новой функцией компиляторов XCode4.4 + на osx10.7 + –

1

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

Так,

  • Если вам требуется, чтобы получить доступ к переменной экземпляра вне класса, то объявить свойство. В заголовочном файле MyClassViewController.h

@property (strong, nonatomic) IBOutlet NSTextField *myTextField;

Так что теперь в других классах, можно получить доступ к этому путем:

MyClassViewController *myClassViewController = [[MyClassViewController alloc] init]; 
[myClassViewController.myTextField setText:@"MyValue"]; 

также получить значение как

NSLog(@"%@", [myClassViewController.myTextField text]); 
  • Если вам не нужен такой общий доступ, но вы хотите, чтобы он наследовать. Затем объявите в блоке объявления класса сам. В заголовочном файле ViewController.h

    @interface ViewController { @public: // or @protected 
        NSString *myString; 
    } 
    

Теперь, если есть другой класс, который наследует ViewController класс, то это свойство будет получить унаследованную в ChildViewController в соответствии с его спецификатора доступа.

  • Если вы хотите полностью скрытую собственность или переменную. Подобно тому, что он даже не используется вне этого класса, вы можете объявить его в файле реализации (.m) в самой частной категории. В ViewController.m файле:

@interface ViewController() {

NSString *myString; 
} 

Таким образом, это будет иметь видимость в .m файл только, больше нигде.

Теперь объявление @property - Вам необходимо объявить это только тогда, когда вам требуются методы по умолчанию для setter-getter (например, setMyString и т. Д.). Это также можно объявить как в .h, так и в .m в соответствии с вашим требованием видимости этого экземпляра.

Надеюсь, теперь вы получаете концепцию. Это все о видимости.

+0

Мой вопрос был специфичен для торговых точек !!! Во всяком случае, это хороший ответ. Почему бы не использовать '@ private' вместо создания категории? – Colas

+1

Да, вы правы в этом вопросе, даже у меня сам такой же вопрос. Но если вы загружаете какой-либо последний код из https://developer.apple.com/library/ios/navigation/#section=Resource%20Types&topic=Sample%20Code Apple сама использует эту методологию. Так что лучше пойти с Apple. – Mrunal