2012-05-13 146 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]){ 

(或者聲明其作爲應用程序委託的屬性。)