2011-03-23 65 views
1

我在理解objective-c,並且在點擊屏幕和遞增存儲在我的appdelegate中的count變量時出現問題。在Objective-C中按值傳遞?

- (void)updateLabel:(NSInteger)num { 
    NSString *s = [[NSString alloc] initWithFormat:@"%@", num]; 
    countLabel.text = s; 
    [s release]; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    TestAppDelegate *aDel = (TestAppDelegate *)[UIApplication sharedApplication].delegate; 
    aDel.count++; 
    NSInteger num = aDel.count; 
    [self updateLabel:num]; 
} 

我得到的EXC_BAD_ACS對我來說,我試圖訪問我不是。它看起來像我不能發送updateLabel num變量,因爲基本類型的範圍消失在方法的末尾,然後當updateLabel試圖訪問它,我得到的錯誤?我想知道我是否正確理解了這個概念。謝謝。

+1

你已經很好地展示了你的想法。但'updateLabel'中的代碼在*'touchedBegan'完成之前運行,所以傳遞給它的任何東西都不會超出範圍。 taskinoor有正確的答案。 – 2011-03-23 07:09:34

回答

1

的問題可能是NSInteger不是對象,看到它的定義由CMD單擊關鍵字:

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE … 
typedef long NSInteger; 
typedef unsigned long NSUInteger; 
#else 
typedef int NSInteger; 
typedef unsigned int NSUInteger; 
#endif 

這意味着你的方法來更新標籤應該看起來有點像這樣:

- (void) updateLabel: (NSInteger) num { 
    countLabel.text = [NSString stringWithFormat:@"%i", num]; 
} 
+0

是的這解決了這個問題。不過,我仍然感到困惑,因爲我認爲initWithFormat和stringWithFormat是相同的,除了initWithFormat,你負責清理內存,並且stringWithFormat自動釋放字符串。看一下Apple頭文件,它說initWithFormat返回NSString,而stringWithFormat返回一個字符串。儘管如此,我不知道兩者之間是否存在真正的差異,但顯然有一種可行,一種不行?任何其他htoughts?謝謝一堆。 – Crystal 2011-03-24 02:22:25

+0

區別不在於initWithFormat Vs stringWithFormat。區別在於格式說明符。你不能使用%@作整數。您需要使用%d或%i。 – taskinoor 2011-03-24 17:31:48

2
 
// format specifier for integer is %d, not %@ 
NSString *s = [[NSString alloc] initWithFormat:@"%d", num]; 

num這裏沒有超出範圍。您將按照價值傳遞給updateLabel。當您致電updateLabel時,還請檢查countLabel尚未發佈。您可以將aDel.count直接傳遞給updateLabel。不需要臨時變量num

[self updateLabel:aDel.count];
+0

直到我的dealloc方法,我才發佈countLabel。有沒有另一種方法可以在這裏訪問錯誤的內存? – Crystal 2011-03-23 15:28:31