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

Objective-C:使用containsObject将BOOL返回为(null),objective-c,null,boolean,Objective C,Null,Boolean,我正在使用AppDelegate中的dispatch_once将NSMutableArray存储在NSUserDefaults中 AppDelegate.m的ApplicationIDFinishLaunchingWithOptions中的代码: 我知道实际数组没有问题,因为当我尝试将其打印到控制台时,它正在正确地打印其内容。例如: 显示视图中的代码 输出: 但是,如果我尝试使用containsObject:检查数组中是否包含元素,则布尔值被指定为null,而不是YES或NO 显示视图中的代码:

我正在使用AppDelegate中的dispatch_once将NSMutableArray存储在NSUserDefaults中

AppDelegate.m的ApplicationIDFinishLaunchingWithOptions中的代码:

我知道实际数组没有问题,因为当我尝试将其打印到控制台时,它正在正确地打印其内容。例如:

显示视图中的代码

输出:

但是,如果我尝试使用containsObject:检查数组中是否包含元素,则布尔值被指定为null,而不是YES或NO

显示视图中的代码:

输出:

我觉得我的逻辑中有一个我似乎无法理解的缺陷


提前谢谢

阅读有关格式说明符的内容,请参阅文档中NSString stringWithFormat:的链接

布尔不是一个对象。您不能使用%@来记录它。改用%d

这将记录0否或1是

或者你可以:

NSLog(@"Has user seen tutorial? %@", hasSeenTutorial ? @"YES" : @"NO");
这将根据BOOL值记录字符串


顺便说一句,您的原始代码记录为null,因为BOOL值NO实际上是0。使用%@正在查找对象指针。BOOL值的0被解释为nil指针,因为nil实际上也只是0。如果您的BOOL值为YES,则应用程序可能会崩溃,因为应用程序将尝试调用内存地址为1的任何对象的description方法,将值设置为YES。

阅读格式说明符,请参阅文档中NSString stringWithFormat的链接:

布尔不是一个对象。您不能使用%@来记录它。改用%d

这将记录0否或1是

或者你可以:

NSLog(@"Has user seen tutorial? %@", hasSeenTutorial ? @"YES" : @"NO");
这将根据BOOL值记录字符串

顺便说一句,您的原始代码记录为null,因为BOOL值NO实际上是0。使用%@正在查找对象指针。BOOL值的0被解释为nil指针,因为nil实际上也只是0。如果BOOL值为YES,则应用程序可能会崩溃,因为应用程序将尝试对内存地址为1的任何对象调用description方法,该值为YES

2014-10-16 16:14:05.720 Unitu[71969:4552403] ARRAY WITH USER IDs: (
    5184
)
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)
NSLog(@"Has user seen tutorial? %d", hasSeenTutorial);
NSLog(@"Has user seen tutorial? %@", hasSeenTutorial ? @"YES" : @"NO");