2011-06-18 27 views
3

我看到一些類似的問題,但沒有簡單的答案。在我真正使用它們之前,我只是玩弄NSMutableArray來感受它們。出於某種原因,當我嘗試調用數組時,它給了我一個EXC_BAD_ACCESS錯誤,並且我找不到原因。NSMutableArray的count方法會導致訪問錯誤?

- (void) applicationDidFinishLaunching:(UIApplication*)application 
{ 
    // Create window and make key 
    _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [_window makeKeyAndVisible]; 

    NSMutableArray* test = [[NSMutableArray alloc] initWithObjects:[NSString stringWithFormat:@"first!"], [NSString stringWithFormat:@"second!"], nil]; 
    [test insertObject:[NSString stringWithFormat:@"inserted"] atIndex:0]; 
    NSLog(@"%@", [test objectAtIndex:0]); 
    NSLog(@"%@", [test objectAtIndex:1]); 
    NSLog(@"%@", [test objectAtIndex:2]); 
    NSLog(@"%@", [test count]); //bad access here 
} 

所有的插入和訪問除了計數方法工作得很好。我不明白爲什麼這不起作用,並會非常感謝一些幫助。謝謝!

回答

2

問題是[test count]返回的NSUInteger不是指針(至NSObject)。試試這個:

NSLog(@"%u", [test count]); 

注意,使用%d也可以,但是%u是首選。

+0

由於返回值是'NSUInteger',因此您應該使用'%u'而不是'%d'。 – DarkDust

+0

@DarkDust:非常正確。我修改了這個答案。 – PengOne

+0

嚴格地說%u是unsigned int,而NSUInteger更可能是unsigned long。 –

8

%@格式說明符打印對象。 -count的返回值只是一個無符號整數。您應該使用該類型的格式說明符%u

+0

嗯,好的。非常感謝!看起來像一個奇怪的錯誤得到只是有錯誤的格式說明符,哈哈。 – TNTisCOOL

+4

@TNTisCOOL:不,一旦你知道它爲什麼崩潰,這並不奇怪。 '%@'說明符需要一個對象的*地址*,並且想要在其上調用'[theObject description]'。當你使用'[test count]'時,你實際上傳遞了一個像3的數字,然後被解釋爲一個地址,但'3'將是一個無效的地址,並試圖訪問它(解引用它)導致崩潰。 – DarkDust

+0

哦,這很有道理!謝謝!我希望我有信譽給你一個投票。 – TNTisCOOL

1

- (NSUInteger)count;返回NSUInteger

使用這個代替:

NSLog(@"%u", [test count]); //bad access here 
+0

它返回一個'NSUInteger',而不是'NSInteger' –

+0

這是一個錯字。謝謝 –

+1

Aaand ..澄清,發生錯誤的訪問是因爲''%@'''格式假定交叉參數是一個'NSObject',並且試圖調用方法'-description',它應該返回'NSString * ',但由於'NSUInteger'只是一個原語,它不能對這種方法做出反應。 – Can

0

count工作就好了。但是它返回的是NSUInteger原語,而不是指向NSObject子類的指針。 %@字符串格式化程序希望指向一個對象,並記錄從該對象的-description方法返回的NSString。當你通過一個NSUIntegerNSLog假定它是一個對象指針並盡力發送-description消息到內存地址3導致EXEC_BAD_ACCESS。

相關問題