Objective-C:使用containsObject将BOOL返回为(null)
我正在使用AppDelegate中的dispatch_once将NSMutableArray存储在NSUserDefaults中 AppDelegate.m的ApplicationIDFinishLaunchingWithOptions中的代码: 我知道实际数组没有问题,因为当我尝试将其打印到控制台时,它正在正确地打印其内容。例如: 显示视图中的代码 输出: 但是,如果我尝试使用containsObject:检查数组中是否包含元素,则布尔值被指定为null,而不是YES或NO 显示视图中的代码: 输出: 我觉得我的逻辑中有一个我似乎无法理解的缺陷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 显示视图中的代码:
提前谢谢 阅读有关格式说明符的内容,请参阅文档中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");