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

时间:2010-02-11 21:46:48

标签: objective-c naming-conventions coding-style

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

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

4 个答案:

答案 0 :(得分: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;
}

<强>更新

正如@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;
}

答案 1 :(得分:2)

此方法称为“designated initializer”。不过,总结一下,Apple有一些相当不错的文档:

  1. 指定的初始化程序应该有详细记录,任何对您的代码进行子类化的人都需要知道需要使用[super init...]调用哪个初始化程序
  2. 指定的初始化程序通常是具有最多参数的初始化程序...但并非总是如此,所以要小心。
  3. 只能从指定的初始化程序中调用[super init],所有其他init方法都应以某种方式调用该初始化程序。

答案 2 :(得分:1)

听起来您正在描述指定的初始化程序。它没有与其他初始值设定项不同的特殊命名约定。通常,初始化程序以“init”开头。

答案 3 :(得分:0)

我通常从基本的- (id)init方法初始化所有内容,并从其他init方法中调用它:

- (id)init
{
    if( self = [super init] )
    {
        myValue = 0.0f;
        myOtherValue = 0.0f;
    }
    return self;
}

- (id)initWithValue:(float)value
{
    if( self = [self init] ) // Calling the other init method (not [super init])
    {
        myValue = value;
    }
    return self;
}