2013-10-16 68 views
0
NSString *str = @"1 2 3 4 5"; 
NSMutableArray *strArray = [[[str componentsSeparatedByString:@" "] mutableCopy] autorelease]; 
[strArray removeObjectAtIndex:3]; 
[strArray removeObjectAtIndex:0]; 

在此代碼的末尾,我期望該數組包含@「2」,@「3」,@「5」。NSString的NSMutableArray的錯誤?

但它包含0x00000,@「2」,@「3」。

如何解決?數字只是舉例,可能有各種長度的各種空格分隔的字符串。

修訂

很奇怪,但它確實寫2,3,5到控制檯。

但這裏是在調試窗口相同的數組:

enter image description here

+0

這真的很奇怪。我沒有看到你的代碼有任何問題。 –

+0

只使用你的代碼,它對我的​​工作很好 –

+0

我更新了你的替代品。請嘗試:) –

回答

1

這是我認爲正在發生的。你有什麼是,如果有的話,在調試器中的錯誤。

讓我們假設NSMutableArray在內部由一個正常的C數組表示。 -removeObjectAtIndex:的簡單實現會將所有對象移動到數組中的前一個插槽後面。這具有O(n)複雜性,其中n是數組中的對象的數量。

優化可能是將「基本索引」與將從索引中減去的數組相關聯,該索引將提供給以索引爲參數的任何方法。這樣,[foo removeObjectAtIndex: 0]可以通過簡單地將nil分配給第一個元素並且使基礎索引碰撞以保持恆定的時間複雜度來實現。

我相信真正的實現比這更復雜,但上面只是爲了說明這個想法。

如果調試器不知道這一點,它將顯示底層C數組,它完全像它在屏幕中所做的那樣限制您的問題。重點在於,如果不能期望知道對象的內部結構,就不能真正相信調試器。將描述打印到控制檯是一種更可靠的檢查對象的方法 - 只要-description有一個有用的實現。

+0

我已經禁用調試模式下的優化。而且在objective-c – user2083364

+0

中將數組的一個元素賦值爲nil看起來是不可能的,但是數組的內部實現是這樣做的,而不是你。 – JeremyP

0

你爲什麼不使用ARC?我已經使用ARC測試了該代碼並且它可以工作。那麼,你能解釋一下你想做什麼嗎? (我便無法增加一條,作爲評論)

+0

因爲我不能簡單地把一個半就緒的項目,並將其轉換爲ARC,因爲只有這個錯誤。 – user2083364

+2

這個答案應該是對這個問題的評論。 – JeremyP

+0

JeremyP,正如我寫的,我無法將其作爲評論添加,因爲當我發佈時,我沒有足夠的評論點。 – Alex

2

不知道爲什麼你的代碼是不工作的工作爲我好,也試圖在下面其他的方式是相同的: -

NSString *str = @"1 2 3 4 5"; 
NSArray *arr1= [str componentsSeparatedByString:@" "]; 
NSMutableArray *strArray=[NSMutableArray arrayWithArray:arr1]; 
[strArray removeObjectAtIndex:3]; 
[strArray removeObjectAtIndex:0]; 
NSLog(@"%@",strArray); 

Output:- 

2 
3 
5 
+0

是的,它的工作原理。但我認爲這是一個調試器的問題。 – user2083364

0

刪除您自動釋放!爲我精心工作!

NSString *str = @"1 2 3 4 5"; 
    NSMutableArray *strArray = [[str componentsSeparatedByString:@" "] mutableCopy]; 
    [strArray removeObjectAtIndex:3]; 
    [strArray removeObjectAtIndex:0]; 
    NSLog(@"strArray = %@", strArray); 

2013年10月16日14:29:35.537註釋[566:C07] strArray =( 2, 3,)