【问题标题】:NSArray item to NSStringNSArray 项到 NSString
【发布时间】:2009-12-19 16:32:47
【问题描述】:

在一个方法中,我有以下代码:

NSString* tempString = (NSString*)arg;
NSArray* notificationDetails = [tempString componentsSeparatedByString:@"##"];
NSString* tempString1 = [notificationDetails objectAtIndex:2];
.
.
.
.
.
. 
NSLog(tempString1);

当我编译代码时,它的编译没有任何错误和警告。 但是在运行时(在带有断点的调试模式下)它在 NSLog 语句处崩溃。 我看到的问题是在获取“[notificationDetails objectAtIndex:2];”时 有什么办法解决这个问题。

【问题讨论】:

    标签: iphone nsstring nsarray


    【解决方案1】:

    使用...

    NSLog(tempString1);
    

    ... 很危险。虽然看起来 NSLog 将接受任何字符串作为其唯一参数,但实际上调用的实际函数的定义清楚地表明,第一个参数在内部被解析为格式字符串。

    void NSLogv (
       NSString *format,
       va_list args
    );
    

    这意味着字符串中任何具有格式含义的字符,即“%”,都将被视为格式,而不是字符。因此,如果您尝试传递字符串,“sale 40% off” NSLog 将查找参数并在找不到参数时崩溃。

    【讨论】:

      【解决方案2】:

      使用

      NSLog(@"%@", tempString1);

      【讨论】:

      • 如果 tempString1 是一个(有效的)字符串,它也是一个有效的格式字符串。 (虽然我也更喜欢带有格式字符串的显式版本)
      • 如果您的字符串确实是格式字符串,但您没有传递必要的参数,您的应用程序可能会崩溃。试试 NSLog(@"%@");
      【解决方案3】:

      notificationDetails 包含多少个元素? 使用以下代码找出: NSLog(@"%d 个元素", [notificationDetails count]);

      arg 是一个字符串吗? NSLog(@"Class of arg is %@", [arg class]);

      【讨论】:

        【解决方案4】:

        另一种可能性,取决于省略号的长度: componentsSeparatedByString: 返回一个自动释放的数组。但我猜组件不足。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多