2013-07-07 4 views
4

Я пытаюсь объявить некоторые переменный экземпляр для класса пользовательских кнопок в Objective C (для прошивки):нужно объявить переменный общедоступный экземпляр в Objective C

@interface PatientIDButton : UIButton { 
    NSUInteger patientID; 
    NSString * patientName; 
} 
@end 

Однако они теперь приватные и I нуждаются в них для других классов. Я предполагаю, что я мог бы сделать для них функции доступа, но как бы я мог сделать сами переменные?

+3

FYI, что делает Иварс общественность очень unidiomatic и в зависимости от того, используете ли вы ARC может значительно усложнить управление памятью. – Chuck

+1

Что сказал @chuck. Прямой доступ к переменным экземпляра - очень плохой шаблон для использования. Прерывает инкапсуляцию и побеждает такие вещи, как KVO. – bbum

+0

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

ответ

8

Для того, чтобы переменные экземпляра общественности, использовать @public ключевое слово, например:

@interface PatientIDButton : UIButton { 
    // we need 'class' level variables 
    @public NSUInteger patientID; 
} 
@end 

Конечно, вы должны помнить все стандартные меры предосторожности обнажая «сырые» переменные для доступа общественности: вы бы лучше с потому что вы сохраните гибкость в изменении их реализации в более позднее время.

Наконец, вы должны помнить, что доступ к общественным переменным требует разыменования - либо со звездочкой или с оператором ->:

PatientIDButton *btn = ... 
btn->patientID = 123; // dot '.' is not going to work here. 
+1

Это кажется более сложным, чем необходимо. Почему бы просто не объявить публичное свойство в файле заголовка? '@property NSUInteger patientID'. Затем каждому экземпляру кнопки может быть доступ через стандартные методы Obj-C. myButton.patientID. –

+1

Да, свойство имеет смысл. Спасибо всем! – easythrees

+0

Не используйте оператор -> для доступа к ivars. – bbum