在 iOS 中将 NSMutableDictionary 添加到 NSMutableArray 时崩溃?

Posted

技术标签:

【中文标题】在 iOS 中将 NSMutableDictionary 添加到 NSMutableArray 时崩溃?【英文标题】:Crashing while Adding NSMutableDictionary to NSMutableArray in iOS? 【发布时间】:2014-12-08 09:14:18 【问题描述】:

我试图将一些数据保存到 fire base.so 格式就像我将内容添加到 NSMutableDictionary 然后将其添加到 NSMutableArray 并发送到 FireBase.For 第一次当我尝试添加第二个内容时它正在工作崩溃并显示以下消息

2014-12-08 14:36:43.388 ChangeText[1634:576618] -[__NSArrayI addObject:]: unrecognized selector sent to instance 0x17023e580
2014-12-08 14:36:43.392 ChangeText[1634:576618] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x17023e580'
*** First throw call stack:
(0x184db259c 0x1954c00e4 0x184db9664 0x184db6418 0x184cbab6c 0x1000fce74 0x189598d34 0x189581e48 0x1895986d0 0x18959835c 0x1895918b0 0x189564fa8 0x189803f58 0x189563510 0x184d6a9ec 0x184d69c90 0x184d67d40 0x184c950a4 0x18de3f5a4 0x1895ca3c0 0x1000fd7ec 0x195b2ea08)
libc++abi.dylib: terminating with uncaught exception of type NSException

我的代码

查看didload

  arr=[[NSMutableArray alloc]init];
    Firebase *fire=[[Firebase alloc]initWithUrl:@"http://del.firebaseio.com/users"];
    [fire observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) 
       // self.status.text=snapshot.value;
        NSLog(@"snapshot%@",snapshot.value);
        arr=[snapshot.value copy];

        NSLog(@"copied%@",arr);


    ];

向 Firebase 添加值的按钮

// arr=[[NSMutableArray alloc]init];

    dict=[[NSMutableDictionary alloc]init];
    [dict setValue:@"test1" forKey:@"username"];
    [dict setValue:@"test2" forKey:@"password"];
    [dict setValue:@"test3" forKey:@"profilepic"];
    [dict setValue:@"test4" forKey:@"profile"];
    [dict setValue:@"test5" forKey:@"details"];
    [arr addObject:dict];
    NSLog(@"added new elements%@",arr);

    Firebase *f=[[Firebase alloc]initWithUrl:@"http://del.firebaseio.com/users"];
    [f setValue:arr ];

我的控制台日志

2014-12-08 14:36:32.017 ChangeText[1634:576618] snapshot(
        
        details = test5;
        password = test2;
        profile = test4;
        profilepic = test3;
        username = test1;
    
)
2014-12-08 14:36:32.019 ChangeText[1634:576618] copied(
        
        details = test5;
        password = test2;
        profile = test4;
        profilepic = test3;
        username = test1;
    
)
2014-12-08 14:36:43.388 ChangeText[1634:576618] -[__NSArrayI addObject:]: unrecognized selector sent to instance 0x17023e580
2014-12-08 14:36:43.392 ChangeText[1634:576618] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x17023e580'
*** First throw call stack:
(0x184db259c 0x1954c00e4 0x184db9664 0x184db6418 0x184cbab6c 0x1000fce74 0x189598d34 0x189581e48 0x1895986d0 0x18959835c 0x1895918b0 0x189564fa8 0x189803f58 0x189563510 0x184d6a9ec 0x184d69c90 0x184d67d40 0x184c950a4 0x18de3f5a4 0x1895ca3c0 0x1000fd7ec 0x195b2ea08)
libc++abi.dylib: terminating with uncaught exception of type NSException

请帮我解决这个错误

【问题讨论】:

【参考方案1】:

[arr addObject:dict]; 在这种情况下造成了崩溃,因为arr 是不可变的。

arr=[snapshot.value copy]; 为您提供对象的不可变副本。你可以试试

arr=[snapshot.value mutableCopy];

【讨论】:

@NaveenKumar:基本一样。 是的,我试过你的也是一样的,但有人怀疑当第一次 snapshot.value 等于 null 时我们如何摆脱?2014-12-08 15:22:01.536 Delibro[1699 :589610] 快照 2014-12-08 15:22:01.538 Delibro [1699:589610] *** -[NSMutableArray addObjectsFromArray:]:数组参数不是 NSArray 2014-12-08 15:22:01.544 Delibro [1699:589610] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“*** -[NSMutableArray addObjectsFromArray:]:数组参数不是 NSArray”*** 第一次抛出调用堆栈:(0x184db259c跨度> 您可以进行 nil/null 检查,如 if (dict) [arr addObject:dict] 【参考方案2】:
arr = [snapshot.value copy];

以上行将NSArray 类型实例分配给您的arr 对象。这就是当您尝试在数组中添加对象时,它会崩溃的原因,因为当前实例的类型是NSArray,而不是NSMutableArray。将以上行替换为以下行:

[arr addObjectsFromArray:snapshot.value];

【讨论】:

我们如何检查snapshot.value是否为空?? 执行nil 检查:if (snapchot.value) [arr addObjectsFromArray:snapchot.value] 这是一个错误的答案,copy 通常返回不可变的副本,对于可变的有mutableCopy OP 正在尝试从数组中添加对象。不复制响应数组。这不是关于复制。我知道copymutableCopy 之间的区别.. 你根本不需要复制。您建议他使用addObjectsFromArray: 中的副本。当您用其他数组填充可变数组时,您不必复制任何内容。复制在这里是多余的。

以上是关于在 iOS 中将 NSMutableDictionary 添加到 NSMutableArray 时崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

在ios中将json转换为字典

无法在 iOS 中将数据写入 .plist

iOS - 在 UINavigationController 中将 UIViewController 显示为全屏

在 iOS 中将照片从相机发布到 Facebook 页面

在 iOS 中将图标加载到 UIImageView 策略中

在ios中将NSString拆分为NSArray