2012-05-13 144 views
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){ 
    [email protected]"yes"; 
} 

现在,当我运行它,我总是得到Thread 1: breakpoint 2.1,我不知道什么做那。我试图删除所有的代码,只留下return YES;在功能,我仍然得到相同的错误= \

任何帮助或提示将有助于感谢你。

+0

你肯定你有没有不小心添加了一个断点? :) –

回答

9

只需简单地返回的NSNumber实例的boolValue,而不是提取其整数值,比较它与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 
5
if (islog == [NSNumber numberWithInt:(1)]) 

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

用途:

if ([islog intValue] == 1) 

代替。

+1

无论如何,他们可能会指向同一个对象。很多常见的'NSNumber'值被缓存。 – dreamlax

+0

@dreamlax:然而,我确定你知道这是一个经典的“不应该依赖的实现细节”。 –

+0

@dreamlax关键词arec几率 –

0

把它作为一种方法,而不是一个属性:

if([appDelegate getISlogged]){ 

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