IBOutlet
ほとんどの Cocoa プロジェクトは、非インスタンス変数のプレフィックスとしてアンダーバーを使用し、インスタンス変数にはプレフィックスを使用しませんIBOutlet
。
インスタンス変数にアンダーバーを使用しない理由はIBOutlet
、nib ファイルがロードされたときに、接続されたアウトレットのセッター メソッドがあれば、そのセッターが呼び出されるからです。 ただし、このメカニズムはKey-Value コーディングを使用しないため、名前の前にアンダーバーが付く IBOutlet ( eg _myField
) は、セッターがアウトレット ( eg )とまったく同じように命名されていない限り、設定されません。 set_myField:
また、次のようなプロパティを使用することは、インスタンス変数にアクセスすることと同じself.myProp
ではないことに注意してください。のようなブラケット表記を使用した場合と同様に、プロパティを使用するとメッセージが送信されます[self myProp]
。すべてのプロパティが行うことは、ゲッターとセッターの両方を 1 行で指定するための簡潔な構文を提供し、それらの実装を合成できるようにすることです。メッセージディスパッチメカニズムを実際に短絡するわけではありません。インスタンス変数に直接アクセスしたいが、その前にプレフィックスを付けたい場合は、ポインターとしてself
扱う必要があります。これは実際には C スタイルのフィールド アクセスです。self
self->myProp
最後に、Cocoa のコードを書くときは決してハンガリー語表記を使用しないでください。また、"f" や "m_" などの他の接頭辞は避けてください。他の Cocoa 開発者から疑いの目で見られる可能性があります。
一般に、 Apple Developer Connectionの Cocoaドキュメントのコーディング ガイドラインのアドバイスに従ってください。そうすれば、他の開発者があなたのコードを理解して理解できるようになります。また、あなたのコードは、ランタイム イントロスペクションを使用するすべての Cocoa 機能でうまく機能します。
私の慣例を使用すると、ウィンドウコントローラークラスは次のようになります。
// 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
and-dealloc
メソッドで使用し、プロパティを他のメソッドで使用していることがわかります。これは通常、プロパティの良いパターンです。初期化子、-dealloc
、およびプロパティの getter と setter で、プロパティの基になるインスタンス変数に触れるだけです。