1

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

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

这是代码:

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

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

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

PSS 我稍后在 -(void)dealloc{} 中发布 resultLabel

4

3 回答 3

5

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;
于 2011-07-12T14:37:29.670 回答
2

你是对的!通过写作:

numberString = resultLabel.text;

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

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

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

于 2011-07-12T14:37:18.863 回答
2

将前两行更改为:

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

由于 NSString 的实例是不可变的,因此您无法在初始化后设置它的值。您在代码中所做的是设置指针。

于 2011-07-12T14:38:20.870 回答