添加到NSUserDefaults - 初学者

时间:2012-02-15 17:09:28

标签: iphone objective-c

你如何比较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];

4 个答案:

答案 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);