Objective c 是否需要将作为参数传入的NSString分配给自定义初始化方法? 请考虑以下两种初始化方法。
第一个方法只是将参数的值传递给各自的NSString属性,而第二个方法分配属性,然后使用initWithString:方法初始化它们。后一个例子中的分配是否必要 提前谢谢Objective c 是否需要将作为参数传入的NSString分配给自定义初始化方法? 请考虑以下两种初始化方法。,objective-c,cocoa,Objective C,Cocoa,第一个方法只是将参数的值传递给各自的NSString属性,而第二个方法分配属性,然后使用initWithString:方法初始化它们。后一个例子中的分配是否必要 提前谢谢 -(id)initWithTitle:(NSString *)theTitle muscleGroup:(NSString *)theMuscleGroup equipment:(NSString *)theEquipment { if((self = [super init])){ title =
-(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;
}
第一个例子是不安全的,因为您没有获得字符串的所有权,所以如果以后在其他地方发布这些字符串,您的程序将会崩溃。第二个例子解决了这个问题,效果很好,但写得更简洁:
-(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;
}
NSString为您提供了一个复制构造函数(
-initWithString:
),它使您能够完成在#2中所做的事情,但并非所有类都能完成<代码>复制要求类实现NSCopying协议,但更符合Cocoa API开发人员希望能够复制对象的方式。参数对象在传入时不会被复制。因此,您的第一个示例可能并不总是有效,这取决于您如何初始化字符串
以下是更安全的(尽管记住释放dealloc方法中的对象):
示例1将分配指针。它不试图保留对象,并且容易受到外部更改对象内容的影响 这可能取决于参数最初是如何构造的 示例2将复制字符串对象并保留它们。只要你在dealloc中发布,那么它就是更好的方法 FWIW
title=[标题副本]代码>
或
title=[[nsstringwithstring:theTitle]retain]代码>
在Ex 2中同样优秀
-(id)initWithTitle:(NSString *)theTitle muscleGroup:(NSString *)theMuscleGroup equipment:(NSString *)theEquipment {
if((self = [super init])){
title = [theTitle retain];
muscleGroup = [theMuscleGroup retain];
equipment = [theEquipment retain];
}
return self;
}