【问题标题】:NSString ReleaseNSString 发布
【发布时间】:2012-01-31 22:02:42
【问题描述】:

我有这个字符串代码,我在尝试释放内存时遇到问题,我知道只有那些释放它的人才会初始化,而不是自动释放,但我在字符串“end”和 nSum 释放时遇到了问题。

NSString *urlBase = [[NSString alloc] initWithFormat:@"http://service.svc/"];
NSString *op = [[NSString alloc] initWithFormat:@"op1"];
NSString * final = [urlBase stringByAppendingFormat:op];
NSString * nSum = sumTextfield.text;
final = [final stringByAppendingFormat:nSum];

//release

[ urlBase release ];
[ op release ];
//[final release]; error
//[final autorelease]; error

感谢您的帮助。

更新:

- (IBAction)mostrarOpciones {
 // code (UP)
}

【问题讨论】:

    标签: objective-c xcode4 ios5 release


    【解决方案1】:

    如果您使用以 init、new、copy 或 mutableCopy 开头的方法创建对象,则您拥有该对象,并负责在完成后释放它(或自动释放它)。如果您使用任何其他方法创建对象,则该对象会自动释放,您不需要释放它。在这种情况下,如果你想保留它,你实际上需要保留它。 Apple 有一个包含所有这些规则的Memory Management Programming Guide

    您发布的代码实际上是正确的。您需要释放urlBaseop,因为您使用以init 开头的方法(在本例中为initWithFormat:)创建了它们。 finalnSum 已经为您自动发布。 final 是由不以 init、new、copy 或 mutableCopy 开头的方法创建的(在本例中为工厂方法 stringByAppendingFormat:)。 nSum 由名为 text 的方法返回,您可以假设 sumTextField “拥有”它或在返回给您之前已自动释放它,因此您不负责释放它。

    【讨论】:

    • 通过应用 autorelease Final 我得到错误。我忘了说这些字符串在 IBAction 中,我在第三个调用按钮中收到错误。
    • 是的,如果您仔细阅读我写的内容,您会注意到我说 final 在您获得时已经自动发布,因此您不需要发布或自己自动释放。如果你自动释放它,它已经被自动释放了两次,这意味着它最终会被释放两次,导致崩溃。
    • 现在我明白了,通过这种调用来实现最终的自动释放。感谢您的帮助。
    • 当然。我建议仔细阅读我链接到的内存管理指南,以确保您真正理解所有这些。就像 Stack Overflow 的提示一样,如果某个答案解决了您的问题,您应该通过单击投票箭头下方的复选标记来“接受”它。这并不是说您必须为我的答案这样做,只有当它真正解决了您的问题时...
    • @idbrii:您很少会在之前分配给其他地方的对象上调用 init 方法(我想不出我曾经这样做过)。在实际使用中,alloc 和 init 基本上总是配对的。更清楚地说,我想我应该说使用 alloc/init 获得的对象带有 +1 引用计数,应该被释放。
    【解决方案2】:

    你不能释放你没有分配的 NSString。由于您的两个变量未分配,因此无需释放它们。

    【讨论】:

      猜你喜欢
      • 2011-07-26
      • 2011-10-03
      • 1970-01-01
      • 2013-05-03
      • 2023-03-20
      • 2010-10-18
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      相关资源
      最近更新 更多