我是Xcode和iPhone开发的新手。我在名为appDelegate.m
的{{1}}文件中编写了一个函数。它是这样的:
getISlogged;
好的,现在我从我的- (BOOL) getISlogged {
NSUserDefaults *usenow = [NSUserDefaults standardUserDefaults];
NSNumber *islog = nil;
if(usenow){
islog = [usenow objectForKey:@"is_log"]; // should equal 1 or 0...
}
UIAlertView * alert1 = [[UIAlertView alloc] initWithTitle:@"works" message:@"test1" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles: nil];
[alert1 show];
if (islog == [NSNumber numberWithInt:(1)]) {
return YES;
} else {
return NO;
}
}
这样称呼它:
viewController.m
现在,当我运行它时,我总是得到SWGAppDelegate *appDelegate = (SWGAppDelegate *)[[UIApplication sharedApplication]delegate];
NSString *islog = @"no";
if(appDelegate.getISlogged){
islog=@"yes";
}
,我不知道该怎么办。我已经尝试删除所有代码并在函数中只留下Thread 1: breakpoint 2.1
但我仍然得到相同的错误= \
任何帮助或提示都会有所帮助。
答案 0 :(得分:9)
只需返回boolValue
实例的NSNumber
,而不是提取其整数值,将其与1进行比较,然后根据该值返回YES
或NO
,例如你的整个方法可以简化为:
- (BOOL) getISlogged {
return [[[NSUserDefaults standardUserDefaults] objectForKey:@"is_log"] boolValue];
}
如果用户默认值中不存在该键,则此方法的结果将为NO
。
另一个“代码嗅觉”是您要为字符串分配布尔值(@"yes"
和@"no"
分配给islog
)。如果你只是打算在某个地方写字符串,那就没有错了,例如到日志,但如果您打算使用此变量来确定是否写入日志,那么您应该将其设为BOOL
。字符串用于存储文本,就是这样。
最后,请记住,在Objective-C中,==
运算符比较对象标识(即,它确认两个引用指向同一个对象),它不比较对象相等性。您可以使用内置isEqual:
方法NSNumber
或“提取”盒装值,并与另一个未装箱的值进行比较,例如:其中任何一个都可以解决问题:
if ([islog isEqualToNumber:[NSNumber numberWithInt:1]])
// do something
// or
if ([islog intValue] == 1)
// do something
答案 1 :(得分:5)
if (islog == [NSNumber numberWithInt:(1)])
那是错的。 (它比较了它们的地址而不是它们的值。)
使用:
if ([islog intValue] == 1)
代替。
答案 2 :(得分:0)
将其称为方法而非财产:
if([appDelegate getISlogged]){
(或者将其声明为app委托中的属性。)