代码之家  ›  专栏  ›  技术社区  ›  Pugalmuni Tom Tharakan

iPhone中的应用程序崩溃问题

  •  0
  • Pugalmuni Tom Tharakan  · 技术社区  · 14 年前

    我使用过不可变字典和不可变数组。使用nsarray of nsmutable字典从plist(documents directory)中存储和检索数据。

         Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray removeObjectAtIndex:]: mutating method sent to immutable object' 
    

    请告诉我为什么会这样?.

    谢谢!

    3 回复  |  直到 14 年前
        1
  •  2
  •   Franci Penov    14 年前

    如果您发布导致此问题的确切代码,可能会有所帮助。我猜你用的时候 NSMutableDictionary 呼唤 valueForKey: 返回一个不可变的 NSArray 你认为它会给你一个 NSMutableArray 实例。请注意,可变数组和字典允许您操作其中的项集合,但不能保证这些项本身是可变的。例如,如果您检查 Property List Programming Guide: Reading and Writing Property-List Data ,您将注意到以下示例:

    如果在属性列表中 这个电话:

    NSMutableArray * ma = [NSMutableArray arrayWithContentsOfFile:xmlFile];

    ma 是不可变数组 每个元素中的字典。每个关键 每个字典中的每个值都是 不变的

    如果需要明确控制每个级别上对象的可变性,请使用 propertyListFromData:mutabilityOption:format:errorDescription:

    您还可以创建一个显式 非晶射线 抄袭 不可变数组 你是从 非可变字典 .

        2
  •  0
  •   Jesse Naugher    14 年前

    你说你要把数组作为 NSArray 而不是把它铸造成 NSMutableArray 在尝试删除对象之前。这会导致错误,因为无法从 不可变数组

        3
  •  0
  •   David M.    14 年前

    假设 [something dictionaryValue] 返回不可变字典,您需要该字典的可变版本。仅仅说:

    NSMutableDictionary *d = [something dictionaryValue];
    

    这只是告诉编译器 d 是一本不可变的字典,但实际上它是你从中得到的不变的字典 [字典值] . 相反,您需要创建一个新的可变字典副本:

    NSMutableDictionary *d = [NSMutableDictionary dictionaryWithDictionary:
                                                  [something dictionaryValue]];
    

    同样地,使用 [NSMutableArray arrayWithArray:...] 对于数组。