2

我对 Xcode 和 iPhone 开发真的很陌生。我在我的appDelegate.m文件中编写了一个名为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,我不知道该怎么办。我已尝试删除所有代码并仅保留return YES;在函数中,但仍然出现相同的错误 =\

任何帮助或提示都会对您有所帮助。

4

3 回答 3

9

只需简单地返回boolValue实例NSNumber,而不是提取其整数值,将其与 1 进行比较,然后返回YESNO基于此,例如,您的整个方法可以简化为:

- (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
于 2012-05-13T20:42:07.403 回答
5
if (islog == [NSNumber numberWithInt:(1)])

这是错误的。(它比较它们的地址而不是它们的值)。

采用:

if ([islog intValue] == 1)

反而。

于 2012-05-13T20:32:31.913 回答
0

将其称为方法而不是属性:

if([appDelegate getISlogged]){

(或将其声明为应用程序委托中的属性。)

于 2012-05-13T20:43:49.750 回答