作为Objective-C(但是长期的C/++)程序员的新手,我正在寻找有关变量命名约定的建议/建议.
我个人的偏好是为实例中的清晰度使用前缀作为实例变量,并防止功能参数的阴影.然而,我是排除前缀的属性的粉丝(除非你也为你的属性名称添加前缀,这不是很好,看起来很糟糕).同样地,我可以使用"self.variable"约定,但前提是我将一切都设为属性.
所以给定下面的代码你的首选实例/函数变量的命名风格是什么?如果你不打扰,你如何处理函数参数的阴影?
@interface GridItem : NSObject { CGRect _rect; ... } @end -(void) initFromRect:(CGRect)rect { _rect = rect; ... }
干杯!
大多数Cocoa项目使用underbar作为非IBOutlet
实例变量前缀,并且不为IBOutlet
实例变量使用前缀.
我不使用underbars作为IBOutlet
实例变量的原因是,当加载nib文件时,如果你有一个连接插座的setter方法,那么将调用该setter. 但是这种机制并没有使用键-值编码,所以一个IBOutlet,其名称的前缀以底线(例如 _myField
)将不会设置,除非二传手名为酷似出口(例如 set_myField:
),这是非标准和严重.
此外,请注意使用属性喜欢self.myProp
是不一样的访问实例变量.您在使用属性时发送消息,就像使用括号表示法一样[self myProp]
.所有属性都为您提供了一个简洁的语法,用于在一行中指定getter和setter,并允许您合成它们的实现; 它们实际上并没有使消息调度机制短路.如果你想直接访问一个实例变量但是在它前面加上self
你需要把它self
当作一个指针,就像self->myProp
一个C风格的字段访问一样.
最后,在编写Cocoa代码时不要使用匈牙利符号,并回避其他前缀如"f"和"m_" - 这会将代码标记为由没有"得到它"的人编写并将导致它被其他Cocoa开发者怀疑.
通常,请遵循Apple Developer Connection中的Cocoa编码指南文档中的建议,其他开发人员将能够学习和理解您的代码,并且您的代码将适用于使用运行时内省的所有Cocoa功能.
以下是使用我的约定的窗口控制器类的外观:
// 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
你会看到,我使用的是引用的实例变量Employee
直接在我-init
和-dealloc
方法,而我使用的其他方法的属性.这通常是一个具有属性的良好模式:只触摸初始化-dealloc
器中的属性的基础实例变量,以及属性的getter和setter中的属性.
我遵循Chris Hanson关于下划线ivar前缀的建议,但我承认我也使用下划线来表示IBOutlets.但是,根据@ mmalc的建议,我最近开始将我的IBOutlet
声明移到@property
线上.好处是我的所有ivars现在都有一个下划线和标准的KVC设置器被称为(即).此外,插座名称在Interface Builder中没有下划线.setNameField:
@interface EmployeeWindowController : NSWindowController { @private // model object this window is presenting Employee *_employee; // outlets connected to views in the window NSTextField *_nameField; NSTextField *_titleField; } - (id)initWithEmployee:(Employee *)employee; @property(readwrite, retain) Employee *employee; @property(nonatomic, retain) IBOutlet NSTextField *nameField; @property(nonatomic, retain) IBOutlet NSTextField *titleField; @end