Majoritatea proiectelor de cacao folosesc sub bara ca prefix de prefix al instanței non-code IBOutlet
și nu folosesc prefix pentru variabilele de instanță IBOutlet
.
Motivul pentru care nu folosesc barele de bare pentru variabilele de instanță IBOutlet
este că atunci când este încărcat un fișier nib, dacă aveți o metodă de setare pentru o priză conectată, acel setter va fi apelat. Cu toate acestea acest mecanism nu utilizează codarea de cod cheie, deci un IBOutlet al cărui nume este prefixat cu un bare de sub ( de exemplu _myField < cod <>> set_myField:
), care este nestandard și brut .
Also, be aware that using properties like self.myProp
is not the same as accessing instance variables. You are sending a message when you use a property, just like if you used bracket notation like [self myProp]
. All properties do is give you a concise syntax for specifying both the getter and setter in a single line, and allow you to synthesize their implementation; they do not actually short-circuit the message dispatch mechanism. If you want to access an instance variable directly but prefix it with self
you need to treat self
as a pointer, like self->myProp
which really is a C-style field access.
În cele din urmă, nu utilizați niciodată o notație maghiară atunci când scrieți codul de cacao și nu vă mai folosiți de alte prefixe precum "f" și "m_"? care va marca codul ca fiind scris de cineva care nu-l "primește" și îl va face să fie privit de suspiciune de alți dezvoltatori de cacao.
În general, urmați recomandările din Codificare Ghidul pentru cacao document la Conexiune dezvoltator Apple și alți dezvoltatori va fi capabil să înțeleagă și să înțeleagă codul dvs., iar codul dvs. va funcționa bine cu toate funcțiile de cacao care utilizează introspecția de runtime.
Iată ce ar putea arăta o clasă de controlor de ferestre, folosind convențiile mele:
// EmployeeWindowController.h
#import
@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
Veți vedea că folosesc variabila de instanță care trimite un Angajat
direct în metoda mea -init
și -dealloc
m folosind proprietatea în alte metode. Acesta este, în general, un model bun cu proprietăți: atingeți numai variabila de bază a unei proprietăți în inițiale, în -dealoc
și în getter și setter pentru proprietate.