目标 C:释放和分配

Posted

技术标签:

【中文标题】目标 C:释放和分配【英文标题】:Objective C: release and alloc 【发布时间】:2011-07-12 14:32:24 【问题描述】:

我对 C 和 Objective C 还很陌生,但是我找不到这个答案

所以我遇到了一个花了我一段时间才解决的问题,基本上我被告知,当你分配一个对象时,你应该释放它。所以这就是我所做的,它导致我的程序崩溃......

代码如下:

NSString *numberString = [[NSString alloc] init];
numberString = resultLabel.text;
[self setFirstNumber:[numberString doubleValue]];
[resultLabel setText:@"0"];
[numberString release];

我想我明白了为什么是因为“numberString = resultLabel.text”行,但是我不明白程序为什么会崩溃。为什么我不能释放 numberString?如果我不这样做会导致内存泄漏吗?

附:我知道代码很笨拙,我是编程新手,而且是 Objective C 的超级新手。

附言我稍后会在 -(void)dealloc

中发布 resultLabel

【问题讨论】:

【参考方案1】:

numberString 是一个指针,这意味着它将指向您分配给它的内存。在第一行,是的,您确实调用了 alloc/init 并且您负责释放它。在下一行,尽管您将指针设置为您不拥有的另一个值,并且您调用 alloc 的原始字符串正在泄漏。致电[[NSString alloc] init] 毫无意义,但这是您使用发布的示例。

NSString *numberString = [[NSString alloc] init]; //Not necessary
[numberString release]; //Properly released now it is safe to reassign
numberString = resultLabel.text; 
//numberString is now pointing at another object

[self setFirstNumber:[numberString doubleValue]];
[resultLabel setText:@"0"];
//No need to release it any more here

您要做的只是将 numberString 设置为文本,而不使用任何释放调用。

NSString *numberString = resultLabel.text;

【讨论】:

对象是否自动释放是实现的细节。您应该关心的是您是否拥有该对象。【参考方案2】:

将前两行改为:

NSString *numberString = [[NSString alloc] initWithString: resultLabel.text];

由于 NSString 的实例是不可变的,所以在初始化它之后你不能设置它的值。您在代码中所做的是设置指针。

【讨论】:

当你可以做到NSString *numberString = resultLabel.text;NSString *numberString = [resultLabel.text retain];时,你为什么要这样做【参考方案3】:

你是对的!通过写作:

numberString = resultLabel.text;

您现在正在引用 resultLabel.text 的 String 实例,当您尝试释放它时,这是一个错误,因为该 String 尚未由您分配,因此您不能释放它。

如果您只是从 resultLabel 后面的 Object 中引用文本,只需省略第一行,因为您只需要一个 NSString 类型的变量(指针),并且不需要一个新的 NSString 实例。

[编辑] 正如 dasdom 正确提到的那样,通过在第一行分配和实例化一个 NSString 对象,您从不使用该对象并且您从不释放(您尝试从其他地方释放的标签中释放 NSString)您造成了内存泄漏。

【讨论】:

加上 numberString 是泄漏。

以上是关于目标 C:释放和分配的主要内容,如果未能解决你的问题,请参考以下文章

C 存储空间的分配和释放

C 和 C++:释放已分配指针的一部分

在 C 中退出程序时释放所需的分配内存

被调用者分配被调用者释放

对象分配及其释放

在 C 和 C++ 中如何分配和释放 *array* 内存?