【问题标题】:NSString contains a number, why does it crash my App?NSString 包含一个数字,为​​什么它会使我的应用程序崩溃?
【发布时间】:2009-04-13 16:28:10
【问题描述】:

我在我的应用程序中使用 NSString 时遇到了一些困难。基本上,我有一个名为 o1string 的 NSString,其中包含值“602”。我想在 UIAlertView 中与其他一些文本一起输出它。

votedmessage = [ NSString stringWithFormat:@"The current standings are as follows:\n\n%@: %@ votes", b1title, o1string ];
UIAlertView *votedAlert = [[UIAlertView alloc] initWithTitle:@"Thank you for voting" message:votedmessage delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];

我使用了 NSLog 并验证了 NSString 中的值肯定是 602,而消息中使用的另一个变量(b1title)可以自行输出。但是,当我将 o1votes 变量添加到警报消息时,我无法弄清楚为什么应用程序会崩溃,这是否与仅在 NSString 中保存一个数字的冲突有关?

这就是 o1string 的设置方式。它肯定包含从 XML 文件中获取的“602”。

o1string = [[options objectAtIndex:3] objectForKey: @"votes"];
o1string = [o1string stringByReplacingOccurrencesOfString:@"\n" withString:@""];
o1string = [o1string stringByReplacingOccurrencesOfString:@"    " withString:@""];

【问题讨论】:

  • 您发布的代码中没有 o1votes 变量。贴出分配变量的代码以及如何使用它。
  • 对不起,我是说 o1string。原帖已更新。
  • 它们都是 NSString。我测试了他们两个。我将 UIAlertView 标题设置为 o1string 并且它崩溃了,但是当我将它设置为 b1title(它也是一个以完全相同的方式填充数据的 NSString)时,它按预期运行。
  • o1string 和 b1title 的唯一区别是 o1string 包含“602”,而 b1title 包含“Jack Escuda”。我认为这是因为 o1string 仅包含一个无法正常工作的数字。
  • 您应该更清楚正在发生的事情。有什么例外?堆栈?

标签: iphone objective-c nsstring


【解决方案1】:

除非 o1string 的分配与创建 votedmessage 的方法相同(因为你没有说,我假设不是),否则当你到达 votedmessage 需要它的代码时它就会消失。

除非您使用垃圾回收,否则您需要保留要保留在当前方法之后的对象。有关完整详细信息,请参阅Objective-C memory management guide

【讨论】:

  • 不是设置在同一个方法里,而是和b1title设置在同一个地方,效果很好。两者最初都在头文件中声明。
  • 如果 b1title 的设置方式相同并且可以正常工作,那么您很幸运,因为您的代码有误。
  • +1 我认为该变量是在创建警报视图之前发布的。
  • +1 您需要保留由 stringByReplacing 返回的字符串... 最好使用属性,并使用点表示法,这样您就不会因为忘记释放旧的 o1string 在为其分配新值而泄漏内存
  • 但是即使你使用属性,理解内存管理也很重要。
【解决方案2】:

您需要发布更多代码。特别是不清楚你发布的两篇文章是在同一个功能还是不同的地方。

如果它们位于不同的位置,您必须调用 [o1string retain](以及稍后的 [o1string release])。最简单的方法是使 olstring 成为具有保留语义的属性。

stringByReplacingOccurrencesOfString 返回一个临时实例,该实例将在函数存在后的某个时间自动释放。

我猜 b1Title 工作的原因是它存储在您的字典中,因此是持久的。 o1string 是从 stringByXXX 函数创建的,是临时的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-18
    • 2012-01-24
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多