我是否需要将作为参数传入的NSStrings分配给自定义初始化方法?

Sab*_*bin 2 cocoa objective-c

请考虑以下两种初始化方法.

第一种方法只是将参数的值传递给它们各自的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)

ale*_*ntd 5

第一个示例是不安全的,因为您没有获取字符串的所有权,因此如果稍后在其他地方发布,您的程序将会崩溃.第二个例子修复了这个问题,并且可以很好地工作,但是这样写的更简洁:

-(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开发人员期望能够复制对象的方式.