Far*_* A. 1 null boolean objective-c
我存储的NSMutableArray在NSUserDefaults使用dispatch_once中AppDelegate.
代码在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)而不是YES或NO.
代码中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)
我觉得我的逻辑中存在一个我似乎无法弄清楚的缺陷.
提前致谢!
阅读格式说明符(请参阅文档中的链接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)因为BOOL值NO确实是0.而使用%@正在寻找一个对象指针.在0该中BOOL值被解释为nil指针,因为nil也确实只是0.如果您的BOOL值是YES,则应用程序可能会崩溃,因为应用程序将尝试description在任何对象恰好位于内存地址1(值为YES)时调用该方法.
| 归档时间: |
|
| 查看次数: |
346 次 |
| 最近记录: |