2014-02-21 87 views
0

我想(在Xcode5中)使用'removeObjectAtIndex'的'MutableArray'需要一個NSUInteger但我使用的變量是一個整數,所以我鑄(NSUInteger * ),但我得到一個警告,說從較小的整數類型轉換爲'NSUInteger *'(aka unsigned long *)。我還沒有鑄造在代碼中的變量「第二」,以保持警告那裏,但它也是一個整數int或NSInteger爲NSUInteger索引

-(void) moveObjectAtIndex:(NSUInteger *)oldIndex toNewIndex:(NSUInteger *)newIndex{ 
    id *member = [self.array objectAtIndex:*oldIndex]; 
    [self.array removeObjectAtIndex:*oldIndex]; 
    if ((NSInteger)newIndex >=(self.array.count)) { 
     newIndex--; //i casted newIndex because I got a warning about ordered comparison of NSUInteger with NSInteger (I'm not sure if this is best solution) 
    } 
    [self.array insertObject:member atIndex: *newIndex]; 
} 

-(void)moveObjectInArray:(NSMutableArray *)array{ 
    [array moveObjectAtIndex:(NSUInteger *) first toNewIndex:second]; 
} 
+0

爲什麼星號/指針?爲什麼不直接傳遞這些整數作爲參數(並直接檢索它們)?你不太可能會迷惑自己,而且你沒有指針指向任何東西(據我所知)。 – matt

+0

你和@Chuck關於指針和星號的說法完全是關鍵的。我提出了每個人都在這裏提出的建議,並解決了這些問題。謝謝 – snapfish

回答

3

你對指針的使用是不可靠的。 id*應該只是idNSUInteger*應該只是NSUInteger - 您不希望指向指向對象的指針或此處指向整數的指針。

-1

在下面的語句

if ((NSInteger)newIndex >=(self.array.count)) 

你類型轉換指針NSInteger的。它應該是

if ((NSInteger)*newIndex >=(self.array.count)) 

不過,你應該小心類型轉換,提防因任何符號/無符號的轉換或數據丟失的後果。

另外,在該線

[array moveObjectAtIndex:(NSUInteger *) first toNewIndex:second]; 

類型的firstNSUInteger *或相同的尺寸。請注意,在64位環境中,long是64位,因爲更小的指針類型與更大的指針類型的類型轉換會導致未定義的行爲。同樣適用於second。一種解決方案是使用臨時變量,然後複製結果。

+0

你能給我一個如何使用臨時變量的例子嗎?如果我使NSUInteger *隨機=第一個相同的警告適用,我不能使用類型ID的變量。 – snapfish

2

你使用的只是NSUInteger而不是NSUInteger *有什麼問題?

-(void) moveObjectAtIndex:(NSUInteger)oldIndex toNewIndex:(NSUInteger)newIndex{ 
    id member = [self.array objectAtIndex:oldIndex]; //Here is id, id* is wrong 
    [self.array removeObjectAtIndex:oldIndex]; 
    newIndex = newIndex >= self.array.count ? : self.array.count - 1; // Here should be self.array.count - 1, not newIndex-1 
    newIndex = MIN(_cloudListArray.count, newIndex); 
    [self.array insertObject:member atIndex:newIndex]; 
}