繁体   English   中英

将对象添加到 NSMutableArray 中,导致应用程序崩溃

[英]Adding object into NSMutableArray , crashing the App

在此处输入图片说明

dict 来自通知,从 dict 中取出 NSData 并将其添加到 NSMutableArray 会导致应用程序崩溃。

偶尔这种崩溃并不总是发生。

您可以直接将数据放入数组,无需强制转换。

if(self.RFTagData != nil){
    self.RFTagData = [dict objectForKey:@"obj"];
}

NSLog(@"array %@", RFTagData);

这会将所有数据添加到obj键下的数组中。

更新:

正如用户 rmaddy & danh 所建议的,所以这里需要关注关于valueForKeyobjectForKey方法的使用以及nil check on the array这一点。

objectForKey :这是一个NSDictionary方法。 NSDictionary 是一个类似于NSArray (集合)的集合类,除了使用像NSArray这样的索引,它使用键来区分项目。 键是您提供的任意字符串。 没有两个对象可以有相同的键(就像NSArray没有两个对象可以有相同的索引)。

valueForKey :这是一种 KVC 方法。 它适用于任何类。 valueForKey:允许您使用字符串作为名称来访问属性。

这里两者都返回与给定键关联的值,因此这里使用valueForKey方法为您提供了解决方案。 但在这种情况下,使用objectForKey是更优选的使用方式。


检查数组中的null值,这些null值看起来像文字@"<null>"而不是NSNull对象,通常用于表示 Cocoa 集合中的nil s。 您可以使用NSArray's filteredArrayUsingPredicate方法将它们filteredArrayUsingPredicate

NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(id value, NSDictionary *unused) {
   return ![str isEqualToString:@"<null>"];
}];

NSArray *filteredAry = [self.RFTagData filteredArrayUsingPredicate:pred];

NSLog(@"array with non null vals %@", filteredAry);

NSData *data=[dict objectForKey:@"obj"]; [self.RFTagData addObject:data];

你可以通过这样做直接添加数据对象。而不是转换为字符串。

将对象添加到数组时,不要将 NSData 类型转换为 NSString。您应该先将 NSData 转换为 NSString,然后将其添加到数组中。因此更好的方法是将此 NSData 使用到 NSString 并将 NSString 添加到数组中。

NSData *data=[dict objectForKey:@"obj"];
NSString *strData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if(data != nil self.RFTagData != nil)
{
   [self.RFTagData addObject:strData];
   .....
}

将数据转换为字符串的示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM