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

Far*_* A. 1 null boolean objective-c

我存储的NSMutableArrayNSUserDefaults使用dispatch_onceAppDelegate.

代码AppDelegate.m'sapplicationDidFinishLaunchingWithOptions:

static dispatch_once_t once;
dispatch_once(&once, ^ {
    [[NSUserDefaults standardUserDefaults] setObject:[[NSMutableArray alloc] init] forKey:@"seenTutorial"];
    [[NSUserDefaults standardUserDefaults] synchronize];
});
Run Code Online (Sandbox Code Playgroud)

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

代码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"]);
Run Code Online (Sandbox Code Playgroud)

输出:

2014-10-16 16:14:05.720 Unitu[71969:4552403] ARRAY WITH USER IDs: (
    5184
)
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试检查元素是否包含在数组中containsObject:,则分配布尔值(null)而不是YESNO.

代码viewDidAppear:

BOOL hasSeenTutorial = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"seenTutorial"] containsObject:currentUserID];
NSLog(@"Has user seen tutorial? %@", hasSeenTutorial);
Run Code Online (Sandbox Code Playgroud)

输出:

2014-10-16 15:59:38.102 App[71662:4542538] Has user seen tutorial? (null)
Run Code Online (Sandbox Code Playgroud)

我觉得我的逻辑中存在一个我似乎无法弄清楚的缺陷.

提前致谢!

rma*_*ddy 5

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

BOOL不是一个对象.您无法使用%@它来记录它.请%d改用.

NSLog(@"Has user seen tutorial? %d", hasSeenTutorial);
Run Code Online (Sandbox Code Playgroud)

这将记录0(NO)或1(YES).

或者你可以这样做:

NSLog(@"Has user seen tutorial? %@", hasSeenTutorial ? @"YES" : @"NO");
Run Code Online (Sandbox Code Playgroud)

这将根据BOOL值记录字符串.

BTW - 您的原始代码日志,(null)因为BOOLNO确实是0.而使用%@正在寻找一个对象指针.在0该中BOOL值被解释为nil指针,因为nil也确实只是0.如果您的BOOL值是YES,则应用程序可能会崩溃,因为应用程序将尝试description在任何对象恰好位于内存地址1(值为YES)时调用该方法.