В большинстве проектов Какао в качестве префикса переменной экземпляра экземпляра, отличного от IBOutlet
, используется подчеркивание, а для переменных IBOutlet
экземпляра префикс не используется.
Причина, по которой я не использую нижние черты для переменных экземпляра IBOutlet
, заключается в том, что при загрузке файла пера, если у вас есть метод установки для подключенной розетки, этот метод вызывается. Однако этот механизм не использует кодирование значения ключа, поэтому IBOutlet, чье имя имеет префикс с подчеркиванием ( например _myField
), не будет устанавливается, если сеттер не имеет названия, точно совпадающего с розеткой ( например set_myField:
), что является нестандартным и грубым.
Также следует помнить, что использование таких свойств, как self.myProp
, не такое же, как доступ к переменным экземпляра. Вы отправляете сообщение при использовании свойства, так же, как если бы вы использовали скобочные обозначения, такие как [self myProp]
. Все свойства дают вам краткий синтаксис для указания как геттера, так и сеттера в одной строке, и позволяют синтезировать их реализацию; на самом деле они не закорачивают механизм отправки сообщений. Если вы хотите получить доступ к переменной экземпляра напрямую, но поставить перед ней префикс self
, вам нужно обработать self
как указатель, например self->myProp
, который действительно является доступом к полю в стиле C.
Наконец, никогда не используйте венгерскую нотацию при написании кода Какао и избегайте других префиксов, таких как "f" и "m_" - это пометит код как написанный кем-то, кто не "получил его" и будет вызвать подозрение со стороны других разработчиков Cocoa.
В целом, следуйте рекомендациям в документе Руководство по кодированию для какао в Apple Developer Connection , и другие разработчики смогут подобрать и понять ваш код, а также ваш код будет хорошо работать со всеми функциями Какао, которые используют самоанализ во время выполнения.
Вот как может выглядеть класс оконного контроллера, используя мои соглашения:
// EmployeeWindowController.h
#import <AppKit/NSWindowController.h>
@interface EmployeeWindowController : NSWindowController {
@private
// model object this window is presenting
Employee *_employee;
// outlets connected to views in the window
IBOutlet NSTextField *nameField;
IBOutlet NSTextField *titleField;
}
- (id)initWithEmployee:(Employee *)employee;
@property(readwrite, retain) Employee *employee;
@end
// EmployeeWindowController.m
#import "EmployeeWindowController.h"
@implementation EmployeeWindowController
@synthesize employee = _employee;
- (id)initWithEmployee:(Employee *)employee {
if (self = [super initWithWindowNibName:@"Employee"]) {
_employee = [employee retain];
}
return self;
}
- (void)dealloc {
[_employee release];
[super dealloc];
}
- (void)windowDidLoad {
// populates the window's controls, not necessary if using bindings
[nameField setStringValue:self.employee.name];
[titleField setStringValue:self.employee.title];
}
@end
Вы увидите, что я использую переменную экземпляра, которая ссылается на Employee
непосредственно в моих методах -init
и -dealloc
, в то время как я использую свойство в других методах. Как правило, это хороший шаблон со свойствами: всегда прикасайтесь к базовой переменной экземпляра для свойства в инициализаторах, в -dealloc
, а также в методах получения и установки для свойства.