objective-c中是否有命名初始值设定项方法的约定?

objective-c中是否有命名初始值设定项方法的约定?,objective-c,naming-conventions,coding-style,Objective C,Naming Conventions,Coding Style,在可以通过不同初始化来初始化的objective-c类中。。。方法,将所有初始值设定项通用的初始化代码收集到一个通用方法中是常识,该方法从其他init*方法(有时也从awakeFromNib)调用 这个方法的命名方式有约定吗?初始化器?是普通的吗 听起来像是在描述指定的初始值设定项。它没有与其他初始值设定项不同的特殊命名约定。通常,初始值设定项以“init”开头。我通常从基本的-(id)init方法初始化所有内容,并从其他init方法调用该方法: - (id)init { if( sel

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


这个方法的命名方式有约定吗?初始化器?是普通的吗

听起来像是在描述指定的初始值设定项。它没有与其他初始值设定项不同的特殊命名约定。通常,初始值设定项以“init”开头。我通常从基本的
-(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;
}

根据苹果公司的说法,初始化方法应该总是以“init”一词开头,然后是描述参数的名称组件。如果一个类有多个初始值设定项,则应将这些方法链接在一起,以便只有其中一个方法在执行所有工作,而其他方法只应为缺少的参数提供默认值

例如,Person类可能具有以下初始化。。。方法:

- (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所指出的,苹果的文档建议(使用ARC编译时,编译器需要)使用调用
[super init]
的返回值重新分配
self

文档还建议在执行任何进一步的初始化之前检查
nil
,这是因为如果对
[super init]
的调用返回
nil
self
在调用返回时已经解除分配,因此将不再有要初始化的实例

苹果的文档还建议避免调用
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;
}
此方法称为“”。不过,总而言之,苹果在这方面有一些相当不错的文档:

  • 指定的初始值设定项应该有很好的文档记录,任何对代码进行子类化的人都需要知道他们需要使用
    [super init…]
  • 指定的初始值设定项通常是参数最多的初始值设定项。。。但并不总是这样,所以要小心
  • 只有从指定的初始值设定项中调用
    [super init]
    ,所有其他init方法都应该以某种方式调用该初始值设定项

  • 这与你应该做的相反。假设最长的初始值设定项是指定的初始值设定项。如果有人对您的类进行子类化,并覆盖您的
    -(id)init
    方法,他们可能会调用
    [super initWithValue:x]
    ,确保您放入
    -init
    中的任何代码都不会被调用。如果您的类可供用户子类化,则只需记录
    init
    方法不应被重写,除非它调用
    [super init]
    。不应该有任何假设。@Martin Cote:另外,请记住,在分配对象时,所有实例变量都为零,因此没有必要为任何实例变量指定0或
    nil
    。据我所知,这是一个相当标准的约定。苹果文档还建议您将
    [super init]
    的返回值分配给
    self
    ,以确保
    self
    不为零。我还模糊地记得一些关于在
    init
    方法中不使用访问器方法的事情。