目标C:发布和分配

时间:2011-07-12 14:32:24

标签: objective-c release alloc

我对C和Objective C很新,但我找不到这个答案

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

以下是代码:

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

我想我弄清楚为什么它是因为“numberString = resultLabel.text”行,但是我不明白程序崩溃的原因。为什么我不能发布numberString?如果我不这样做会导致内存泄漏吗?

P.S。我知道代码很笨拙,我是编程的新手,也是Objective C的超级新手。

P.S.S。我稍后在 - (void)dealloc {}

中发布了resultLabel

3 个答案:

答案 0 :(得分:5)

numberString是一个指针,表示它将指向您指定的内存。在第一行是的,你确实调用了alloc / init,你负责释放它。在下一行,虽然您将指针设置为您不拥有的另一个值,并且您调用alloc on的原始字符串将被泄露。对[[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;

答案 1 :(得分:2)

你是对的!写下:

numberString = resultLabel.text;

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

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

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

答案 2 :(得分:2)

将前两行更改为:

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

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