gpt4 book ai didi

iphone - Objective-c:不使用 alloc 时何时自动释放 nsnumber 对象

转载 作者:行者123 更新时间:2023-11-29 04:44:05 26 4
gpt4 key购买 nike

我注意到我的程序崩溃了,因为内存不足。我发现这是由于以下代码段而发生的:

DataSet *tempSet = [[DataSet alloc] init];          
tempSet.rightFoot = [NSNumber numberWithDouble:temp1];
tempSet.leftFoot = [NSNumber numberWithDouble:temp2];
[footData addObject:tempSet]; //add dataSet object to the array
[tempSet release];

我在线阅读了一些有关内存管理的教程,并发现我需要这样做:(注意添加的“自动释放”)

DataSet *tempSet = [[DataSet alloc] init];          
tempSet.rightFoot = [[NSNumber numberWithDouble:temp1] autorelease];
tempSet.leftFoot = [[NSNumber numberWithDouble:temp2] autorelease];
[footData addObject:tempSet]; //add dataSet object to the array
[tempSet release];

我仍然很困惑为什么我必须这样做。创建 numberWithDouble 时我没有使用 alloc、new 或 copy。

这是否意味着在这种情况下我也需要添加自动释放?:

[subset addObject:[NSNumber numberWithDouble:temp]];

这种情况怎么办?:

tempSet.rightFoot = [NSString stringWithString:@"temp"];

感谢任何帮助。

最佳答案

+numberWithDouble

被称为便捷方法。意思是,它取代了如下所示的一小部分代码:

[[[NSNumber alloc]initWithDouble:double]autorelease];

大多数(如果不是全部)便利方法默认情况下都是自动释放的,因此带有自动释放的OP代码不正确,因为它将保留计数降低到-1。

但是等号相当于

[self setRightFoot:[[[NSString alloc]initWithString]autorelease]];

这会增加 rightFoot 的保留计数并要求将其释放到其他地方。

对于-addObject代码,它返回void,因此它实际上不会增加​​接收者的保留计数,并且不需要释放接收者。数组中的对象应该已经被方便的方法释放以供稍后使用,这并不重要,因为数组现在保存着它的“副本”。

关于iphone - Objective-c:不使用 alloc 时何时自动释放 nsnumber 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9901263/

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