目标 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:释放和分配的主要内容,如果未能解决你的问题,请参考以下文章