Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 是否需要将作为参数传入的NSString分配给自定义初始化方法? 请考虑以下两种初始化方法。_Objective C_Cocoa - Fatal编程技术网

Objective c 是否需要将作为参数传入的NSString分配给自定义初始化方法? 请考虑以下两种初始化方法。

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 =

第一个方法只是将参数的值传递给各自的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; 
}

第一个例子是不安全的,因为您没有获得字符串的所有权,所以如果以后在其他地方发布这些字符串,您的程序将会崩溃。第二个例子解决了这个问题,效果很好,但写得更简洁:

-(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; 
}