【问题标题】:Getting an error when creating an NSMutableString when iterating an NSCountedSet in Objective-C在 Objective-C 中迭代 NSCountedSet 时创建 NSMutableString 时出错
【发布时间】:2015-04-12 03:59:38
【问题描述】:

我在 for 循环中迭代一个 NSCountedSet,然后尝试创建一个由它持有的 NSString 对象以及该特定对象的计数组成的 NSMutableString,然后将新创建的 NSMutableString 插入NSMutableArray。但是,当我这样做时,我收到以下错误:

Attempt to mutate immutable object with appendFormat

这是我正在使用的代码:

    for (NSMutableString *myString in myCountedSet) {

        [myString appendFormat:@"-%lu", (unsigned long)[myCountedSet countForObject:myString]];
        [myArray addObject:myString];
    }

我只是尝试为 NSCountedSet 中的每个对象构造一个形式为 myString-count 的字符串,然后将此字符串插入到数组中。谁能看到我做错了什么?

【问题讨论】:

  • 字符串实际上是可变的吗?你是如何创建它们的?
  • NSCountedSet 已经包含 NSString 对象。
  • 如果你在循环的第一行设置断点,然后在 lldb 窗口中输入:po [myString class],你会看到什么?
  • 我明白了。它包含 NSStrings 而不是 NSMutableStrings。这就是为什么我问你是如何创建它们的
  • 正确。如果它们包含 NSString 对象,我应该做一些不同的事情吗?

标签: ios objective-c nsmutablestring nscountedset


【解决方案1】:

我猜你的字符串实际上不是可变的。所以把代码改成:

for (NSMutableString *myString in myCountedSet) {

    NSString *combinedString = [NSString stringWithFormat:@"%@-%lu", myString,(unsigned long)[myCountedSet countForObject:myString]];
    [myArray addObject:combinedString];
}

【讨论】:

  • 非常感谢您的及时回复。是否行: [myArray combinedString] = [myArray addObject:combinedString] ?
  • 打错字了,我已经改正了
  • 将第 1 行更改为 for(NSString *myString in myCountedSet) { ?
  • 这样会更好,并且在尝试追加时会给您一个警告。
  • 而且 - 不 - 不要用 NSMutableStrings 填充计数集。集合依赖于它们的条目是不可变的。想想如果你这样做会发生什么: NSMutableString *s = [NSMutableString stringWithString: @"whatever"]; [设置添加对象:s]; [设置添加对象:s]; // 现在你有了任何东西 -> count 2.. 现在改变字符串......当你在集合中搜索 @"whatever" 时会发生什么?
猜你喜欢
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 2023-03-13
  • 2013-05-26
相关资源
最近更新 更多