gpt4 book ai didi

objective-c - 在 objective-c 中在二传手中保留和释放

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

初学者问题在这里:

我试图了解一些基本的内存管理。如果我要重写setter方法,以下内容是否可以充分处理传入字符串的内存管理?

- (void)setMyString:(NSString *)string
{
if (_myString != string){
[string retain];
[_myString release];
_myString = string;
}
}

我的逻辑是,一旦我们进入该if语句,我就想获得传入字符串的所有权,因此要保留。接下来,我释放_myString对象。然后,我将_myString对象设置为字符串对象。这是我困惑的根源:此时我是否需要保留myString对象?还是由于将其设置为等于字符串对象而已经拥有了它的所有权?

谢谢!

最佳答案

您写的内容正确,除了最后的return _myString语句。

当您调用保留字符串时,您会将实例的引用计数加1。将string的值关联到_myString不会更改实际实例(现在由string_myString都指向),因此不需要第二个保留,这将是不正确的。

所有这些,您所拥有的只是多余的。进行if (_myString != string)检查的原因是,如果用已拥有的相同对象调用了setter,则在有机会保留该对象之前,您不希望释放该对象。在这种情况下,该程序将崩溃,因为您释放它后,它会被释放,但是您保留对它的引用并继续使用它(发送消息)。由于对象是相同的,因此如果函数的参数与实例变量的当前值相同,则不执行任何操作即可避免此问题。但是,在释放实例变量之前保留参数是完成完全相同的另一种方法。

因此,您可以执行以下任一操作:

- (void)setMyString:(NSString *)string
{
if (_myString != string) {
[_myString release];
_myString = [string retain];
}
}

或这个:
- (void)setMyString:(NSString *)string
{
[string retain];
[_myString release];
_myString = string;
}

我倾向于第一种方法,因为如果值相同,它会(非常轻微)更快,并且在写出时会更简单。但是,实际上,这取决于个人喜好,并且原始问题中的表格也很好。

关于objective-c - 在 objective-c 中在二传手中保留和释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12847046/

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