Objective-C:使用containsObject将BOOL返回为(null)

时间:2014-10-16 15:20:21

标签: objective-c null boolean

我在NSMutableArray中使用NSUserDefaultsdispatch_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),而不是YESNO。< / 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)

我觉得我的逻辑中存在一个我无法理解的缺陷。

提前致谢!

1 个答案:

答案 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)的值。