2011-12-11 209 views
2

添加對象,我有以下代碼:從另一個陣列

for (int i = 1; i <= [nmaSpread count];) 
{ 
    [nmaUserName addObjectsFromArray:[nmaSpread objectAtIndex:i]]; 
    [nmaSpread removeObjectAtIndex:i]; 
    i += 2; 
} 

我已經聲明的所有變量爲全局,nmaUserName和nmaSpread都是NSMutableArrays,並在viewDidLoad中已被分配。

我想將所有來自nmaSpread的奇怪對象存儲到nmaUsername中,然後在nmaSpread中刪除活動對象。

但是它一直與此錯誤崩潰:

[NSMutableArray addObjectsFromArray:]: array argument is not an NSArray 2011-12-11 21:08:55.123 appName[15671:f803] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* -[NSMutableArray addObjectsFromArray:]: array argument is not an NSArray'

回答

3

nmaSpread本身就是一個NSMutableArray,但它看起來像它包含的對象。當您執行[nmaSpread objectAtIndex:i]時,將從nmaSpread返回一個對象。該對象不是數組,因此要添加它,您只需使用addObject:而不是addObjectsFromArray:

+0

啊我看到非常感謝查克!解決問題。謝謝。 –

1

的NSMutableArray的addObjectsFromArray希望你通過另一個數組,但你傳遞一個對象(一個索引 'I')

你可以嘗試切換

[nmaUserName addObjectsFromArray:[nmaSpread objectAtIndex:i]]; 

[nmaUserName addObject:[nmaSpread objectAtIndex:i]]; 

這將消除你看到的錯誤,但是你很可能會遇到另一個問題,因爲你正在從nmaSpread中刪除對象,因此,數組中稍後的項目索引被移位。你應該改變你的邏輯來解決這個問題。

2

你的代碼有幾個問題。

首先,您已經錯過了解-addObjectsFromArray:的功能。你想要的實際方法只是addObject:

其次,在循環中修改數組是很危險的。蘋果公司的官方說法是:「這可能在某些情況下有效,但不要這樣做,因爲它可能會在將來的任何時候停止工作」。您需要等到循環完數組後才能刪除它們。你當前的代碼肯定是做錯了。

你可以坐下來與筆/紙和制定出數學讓這一切完好,但它更容易和更安全地只是這樣做:

NSMutableIndexSet *indexesToRemove = [NSMutableIndexSet indexSet]; 

for (int i = 1; i <= [nmaSpread count];) 
{ 
    [nmaUserName addObject:[nmaSpread objectAtIndex:i]]; 
    [indexesToRemove addIndex:i]; 
    i += 2; 
} 

[mmaSpread removeObjectsAtIndexes:indexesToRemove]; 
+0

好的謝謝:)我也犯了一個錯誤,它應該是我+ = 1,使奇數。 –