objective-c中是否有命名初始值设定项方法的约定?
在可以通过不同初始化来初始化的objective-c类中。。。方法,将所有初始值设定项通用的初始化代码收集到一个通用方法中是常识,该方法从其他init*方法(有时也从awakeFromNib)调用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
这个方法的命名方式有约定吗?初始化器?是普通的吗 听起来像是在描述指定的初始值设定项。它没有与其他初始值设定项不同的特殊命名约定。通常,初始值设定项以“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
方法中不使用访问器方法的事情。