你如何比较2 NSMutableArray
?
不同的人可能会说这是一个重复的问题,但在查看了大部分SO问题之后我还没有找到解决问题的方法。
有Person
个对象,它有字段Name, Age, Rank
我有一个MutableArray
,可以保存NSUserDefaults
的数据。然后它会看到NSMutableArray
是否包含该特定对象。如果没有,它会将其添加到NSUserDefaults
。
将person对象添加到NSUserDefaults
时会出现问题(我通过数组添加person对象,请参阅代码)。
当我打印[data count]
时,它总是0
。因此可能无法正确添加到NSUserDefaults
。或者我可能会犯一些错误。
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if (userDefaults ) {
NSArray *arr= [userDefaults objectForKey:@"person"];
data = [NSMutableArray arrayWithArray:arr];
NSLog (@"%i ", [data count]);
if (! [data containsObject:self.person] ) {
[data addObject:self.person];
NSArray *personarr= [NSArray arrayWithArray:data];
[userDefaults setObject:personarr forKey:@"person"];
[userDefaults synchronize];
答案 0 :(得分:2)
如果self.person
是类Person
的实例,则无法将其置于用户默认值中,即使在数组中也是如此。来自NSUserDefaults文档:
value参数只能是属性列表对象:NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。对于NSArray和NSDictionary对象,它们的内容必须是属性列表对象。
他们建议将this作为进一步阅读,其中列出了计为属性列表对象的类型。
答案 1 :(得分:1)
您可以在Person类中实现方法以将其数据导出到Dictionary中,并使用init方法从同一个Dictionary重构自身。正如Amorya指出的那样,你不能将任意对象粘贴到NSUserDefaults中。
答案 2 :(得分:0)
您将您的Person对象保存在NSArray中,然后将NSArray保存到NSUserDefaults,但这还不够。在将其保存到NSUserDefaults之前,必须先序列化Person对象。
这篇文章将更好地解释这一点:Storing custom objects in an NSMutableArray in NSUserDefaults
尝试NSLog(@“%@”self.person);在你的if语句之前,因为我怀疑它可能是nil。
我希望能帮助你。
答案 3 :(得分:0)
如果你从NSUserDefaults
得到一个数组,它将永远不会是与任何当前对象(如self.person)相同的指针..所以这将永远不会起作用。使用==
比较对象会比较其内存地址。
如果您想比较它们,请使用它们的内容。 (例如[[person objectForKey: @"Name"] isEqualToString: [person2 objectForKey: @"Name"]]
)。所以你应该循环并检查,如果新人的名字已经存在。
此外,arrayWithArray
不是NSMutableArray
的初始化程序。
所以,如果它应该是可变的,那就这样做:
NSArray *arr= [userDefaults objectForKey:@"person"];
data = [[arr mutableCopy] autorelease];
如果您的计数始终为零,请检查实际的数组内容并查看其中的内容。 例如。像这样:
NSArray *arr= [userDefaults objectForKey:@"person"];
CFShow(arr);