Voi*_*ter 3 coding-style objective-c naming-conventions
在可以通过不同的init ...方法初始化的objective-c类中,将所有初始化程序通用的初始化代码收集到从其他init*方法调用的一个常用方法(或者有时也来自awakeFromNib).
有关如何命名此方法的约定?初始化?initCommon?...?
根据Apple的说法,初始化方法应始终以"init"一词开头,后跟描述参数的名称组件.如果一个类有多个初始值设定项,那么这些方法应该链接在一起,这样只有其中一个方法可以完成所有工作,而其他方法应该只为缺少的参数提供默认值.
例如,Person类可能具有以下init ...方法:
- (id)init
{
return [self initWithFirstName:nil
lastName:nil];
}
- (id)initWithFirstName:(NSString *)firstName
lastName:(NSString *)lastName
{
return [self initWithFirstName:firstName
lastName:lastName
age:nil];
}
- (id)initWithFirstName:(NSString *)firstName
lastName:(NSString *)lastName
age:(NSNumber *)age
{
[super init];
self.firstName = firstName;
self.lastName = lastName;
self.age = age;
return self;
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
正如@dreamlax指出的那样,Apple的文档建议(以及编译时需要的ARC编译)重新分配self调用的返回值[super init].
文档还建议nil在执行任何进一步的初始化之前检查这是因为如果对[super init]返回的调用在调用返回nil时self已经被释放,那么将不再有实例进行初始化.
Apple的文档还建议避免在init...方法中调用访问器方法; 相反,他们建议直接设置实例变量.因此,initWithFirstName:lastName:age:理想情况下,上面显示的方法应该以类似于以下示例的方式编写:
- (id)initWithFirstName:(NSString *)firstName
lastName:(NSString *)lastName
age:(NSNumber *)age
{
self = [super init];
if (self == nil) return nil;
_firstName = [firstName copy];
_self.lastName = [lastName copy];
_age = [age copy];
return self;
}
Run Code Online (Sandbox Code Playgroud)