我在NSMutableArray
中使用NSUserDefaults
在dispatch_once
中存储了AppDelegate
。
AppDelegate.m
applicationDidFinishLaunchingWithOptions:
中的代码
static dispatch_once_t once;
dispatch_once(&once, ^ {
[[NSUserDefaults standardUserDefaults] setObject:[[NSMutableArray alloc] init] forKey:@"seenTutorial"];
[[NSUserDefaults standardUserDefaults] synchronize];
});
我知道实际阵列没有什么问题,因为当我尝试将其打印到控制台时正确打印其内容。例如:
viewDidAppear
中的代码
NSMutableArray *usersWhoHaveSeenTutorial = [[NSUserDefaults standardUserDefaults] objectForKey:@"seenTutorial"];
[usersWhoHaveSeenTutorial addObject:currentUserID];
[[NSUserDefaults standardUserDefaults] setObject:usersWhoHaveSeenTutorial forKey:@"seenTutorial"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"ARRAY WITH USER IDs: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"seenTutorial"]);
输出:
2014-10-16 16:14:05.720 Unitu[71969:4552403] ARRAY WITH USER IDs: (
5184
)
但是,如果我尝试使用containsObject:
检查数组中是否包含元素,则会为布尔值分配(null)
,而不是YES
或NO
。< / p>
viewDidAppear
中的
代码:
BOOL hasSeenTutorial = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"seenTutorial"] containsObject:currentUserID];
NSLog(@"Has user seen tutorial? %@", hasSeenTutorial);
输出:
2014-10-16 15:59:38.102 App[71662:4542538] Has user seen tutorial? (null)
我觉得我的逻辑中存在一个我无法理解的缺陷。
提前致谢!
答案 0 :(得分:5)
阅读格式说明符(请参阅NSString stringWithFormat:
文档中的链接)。
BOOL
不是对象。您无法使用%@
进行记录。请改用%d
。
NSLog(@"Has user seen tutorial? %d", hasSeenTutorial);
这将记录0
(否)或1
(是)。
或者你可以这样做:
NSLog(@"Has user seen tutorial? %@", hasSeenTutorial ? @"YES" : @"NO");
这将根据BOOL
值记录字符串。
BTW - 您的原始代码会记录(null)
,因为BOOL
NO
的值实际上是0
。使用%@
正在寻找一个对象指针。 0
值的BOOL
被解释为nil
指针,因为nil
实际上只是0
。如果您的BOOL
值为YES
,则该应用可能会崩溃,因为该应用会尝试在内存地址description
上的任何对象上调用1
方法( YES
)的值。