请考虑以下两种初始化方法.
第一种方法只是将参数的值传递给它们各自的NSString属性,但第二种方法分配属性,然后使用initWithString:方法初始化它们.后一个例子中的分配是否必要?
提前致谢.
-(id)initWithTitle:(NSString *)theTitle muscleGroup:(NSString *)theMuscleGroup equipment:(NSString *)theEquipment {
if((self = [super init])){
title = theTitle;
muscleGroup = theMuscleGroup;
equipment = theEquipment;
}
return self;
}
-(id)initWithTitle2:(NSString *)theTitle muscleGroup:(NSString *)theMuscleGroup equipment:(NSString *)theEquipment {
if((self = [super init])){
title = [[NSString alloc] initWithString:theTitle];
muscleGroup = [[NSString alloc] initWithString:theMuscleGroup];
equipment = [[NSString alloc] initWithString:theEquipment];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
第一个示例是不安全的,因为您没有获取字符串的所有权,因此如果稍后在其他地方发布,您的程序将会崩溃.第二个例子修复了这个问题,并且可以很好地工作,但是这样写的更简洁:
-(id)initWithTitle2:(NSString *)theTitle muscleGroup:(NSString *)theMuscleGroup equipment:(NSString *)theEquipment {
if((self = [super init])){
title = [theTitle copy];
muscleGroup = [theMuscleGroup copy];
equipment = [theEquipment copy];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
NSString为您提供了一个复制构造函数(-initWithString:),它使您能够在#2中执行您正在执行的操作,但并非所有类都执行.copy要求类实现NSCopying协议,但更符合Cocoa API开发人员期望能够复制对象的方式.