在objective-c中是否存在命名初始化方法的约定?

Voi*_*ter 3 coding-style objective-c naming-conventions

在可以通过不同的init ...方法初始化的objective-c类中,将所有初始化程序通用的初始化代码收集到从其他init*方法调用的一个常用方法(或者有时也来自awakeFromNib).

有关如何命名此方法的约定?初始化initCommon?...?

jle*_*ehr 5

根据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]返回的调用在调用返回nilself已经被释放,那么将不再有实例进行初始化.

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)