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 释放@property(copy)实例变量?_Objective C_Cocoa - Fatal编程技术网

Objective c 释放@property(copy)实例变量?

Objective c 释放@property(copy)实例变量?,objective-c,cocoa,Objective C,Cocoa,我很确定我做得对,但我只是想检查一下。我有两个实例变量,它们具有通过@property创建的访问器。在我的dealloc(对于同一个对象)中,我释放这些对象 @property(copy) NSString *firName; @property(copy) NSString *surName; -(void)dealloc { NSLog(@"_deal: %@", self); [firName release]; [surName release]; [s

我很确定我做得对,但我只是想检查一下。我有两个实例变量,它们具有通过@property创建的访问器。在我的dealloc(对于同一个对象)中,我释放这些对象

@property(copy) NSString *firName;
@property(copy) NSString *surName;

-(void)dealloc {
    NSLog(@"_deal: %@", self);
    [firName release];
    [surName release];
    [super dealloc];
}

加里看起来不错。我通常使用
非原子
保留
和NSString属性

编辑:
复制它。

是的,没错


在复制新值之前,将调用
release
,因此您需要担心的唯一内存管理是在
dealloc
方法中释放,您正在这样做。

这是正确的。记住内存所有权策略。因为您使用的是复制,所以您可以像使用retain一样获得对象的所有权,因此在完成后可以释放。

OP可能会确保没有其他人修改一个已经过的NSString,而该NSString实际上是一个NSMutableString.True。虽然如果不是这样,它应该切换到保留,但是没有必要为无意义的副本。嗨,Ben,是的,我的想法是创建一个副本以防止原始版本被发布或被修改。NSString属性应该[几乎]始终是(副本)。如果传递了NSString,则副本是免费的。如果传递NSMutableString,则副本可防止调用方在设置属性值后无意中修改属性值。这是标准和推荐的款式。马拉克瑟:不,应该是复制品。永远不要假设每个给你传递字符串的人都会给你传递一个不变的字符串。唯一应该保留的时间是,如果类型是
NSMutableString*
,并且您明确表示将对传入的字符串进行变异,这是非常不寻常的@Bryan:是的,他可以这样做,但这比一个容易理解的
retain
调用的可读性/可维护性要差得多。