代码之家  ›  专栏  ›  技术社区  ›  VoidPointer

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

  •  3
  • VoidPointer  · 技术社区  · 16 年前

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

    这个方法的命名方式有约定吗? 初始值设定项 ? ? ...?

    4 回复  |  直到 16 年前
        1
  •  5
  •   jlehr    13 年前

    根据苹果公司的说法,初始化方法应该总是以“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;
    }
    

    更新

    self 使用调用的返回值 [super init] .

    nil 在执行任何进一步的初始化之前,这是因为 [超级初始化] 返回 , 自己 在调用返回时已被解除分配,因此不再有要初始化的实例。

    苹果的文档还建议避免在应用程序中调用访问器方法 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;
    }
    
        2
  •  2
  •   kubi    16 年前

    此方法称为“ designated initializer ". 不过,总而言之,苹果在这方面有一些相当不错的文档:

    1. 指定的初始值设定项应该有很好的文档记录,任何对代码进行子类化的人都需要知道他们需要使用哪个初始值设定项来调用 [super init...]
    2. 仅调用 [super init]
        3
  •  1
  •   gerry3    16 年前

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

        4
  •  0
  •   Martin Cote    16 年前

    - (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;
    }
    
    推荐文章