gpt4 book ai didi

objective-c - 释放属性(property)(Objective-C)

转载 作者:行者123 更新时间:2023-12-03 20:27:17 25 4
gpt4 key购买 nike

我有一个@property,其定义如下:

@property(非原子,保留)名称;

在函数中,我解析一些 xml 并设置 name 属性。我的问题是,我是否应该在保留新实例之前显式释放先前保留的实例?

例如:

myObj.name = [otherObj getName];//保留计数+1

..

myObj.name = [otherObj getName];//这是名称的新实例,以前的名称是否已释放?

最佳答案

在综合属性 setter 中,代码执行的操作与此大致类似(我们将 name 作为属性名称,_name 将作为实例变量它所指的):

- (void) setName: (NSString *) newValue
{
if ( newValue == _name )
return;

[newValue retain];
[_name release];
_name = newValue;
}

现在,这显示了根据您上面的属性(property)声明会发生什么。根据该属性的其他可能属性,该函数将使用 [newValue copy] 而不是 [newValue keep] (如果指定了 'copy' 属性),或者将其全部封装在 @synchronized(self) block 中(如果未提供提供“nonatomic”属性)。

我还应该注意,由于您的属性引用了 NSString,它实现了 NSCopying 协议(protocol),因此您实际上应该使用复制而不是保留,即:

@property (nonatomic, copy) NSString * name;

这将导致合成的 setter 使用 -copy 而不是 -retain,当您实际传递 NSMutableString 对象时,这会更安全。不可变字符串最终只会由 -copy 调用保留,而可变字符串将创建一个新的不可变副本。如果不这样做,意味着字符串本身在被传递到 setter 后可能会被更改,从而在对象不知情的情况下更改值。

关于objective-c - 释放属性(property)(Objective-C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/843337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com