我对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答案 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的实例是不可变的,因此在初始化之后无法设置其值。你在代码中做的是设置指针。