2011-05-06 52 views
2

我無法從我的NSMutableArray中刪除項目。我對Objective-C非常陌生,所以請耐心等待。枚舉並從NSMutableArray中刪除特定對象

到目前爲止,我有以下幾點:我試圖從數組中刪除一行,如果它裏面有某些文本。在快速枚舉時我無法做到這一點,所以我試圖存儲索引,在枚舉完成後刪除。但是,我被告知這使得從一個整數的指針沒有演員。困惑!

//First remove any previous Offending entry. 
//Read hostfile into array. 
NSString *hostFileOriginalString = [[NSString alloc] initWithContentsOfFile:@"/etc/hosts"]; 
NSMutableArray *hostFileOriginalArray = [[hostFileOriginalString componentsSeparatedByString:@"\n"] mutableCopy]; 
NSInteger hostFileOffendingLocation; 

//Use a for each loop to iterate through the array. 
for (NSString *lineOfHosts in hostFileOriginalArray) { 

    if ([lineOfHosts rangeOfString:@"Offending"].location != NSNotFound) { 

    //Offending entry found, so remove it. 
    //[hostFileOriginalArray removeObject:lineOfHosts]; 

    hostFileOffendingLocation = [hostFileOriginalArray indexOfObject:lineOfHosts]; 
    //NSLog(@"%@", hostFileOffendingLocation); 
} 

} 
//Release the Array. 
[hostFileOriginalArray release]; 

//Remove offending entry from Array. 
[hostFileOriginalArray removeObject:hostFileOffendingLocation]; 
+0

這使得一個沒有強制轉換的整型指針,因爲你正在向'removeObject:'傳遞一個整數。我認爲'removeObjectAtIndex:'就是你以後的樣子。另外,爲什麼在嘗試刪除對象之前釋放數組? – albertamg 2011-05-06 19:12:08

回答

0

我真正的問題是爲什麼要修改它

嘗試移動

[hostFileOriginalArray release]; 

[hostFileOriginalArray removeObject:hostFileOffendingLocation]; 
+0

謝謝。我現在改變了它。但是,原來的問題依然存在。 – Phill 2011-05-06 19:01:28

+1

hrmmmm有趣 – 2011-05-06 19:07:29

+0

它是否顯示爲從可變數組中刪除而不是從原始數據中刪除,還是仍在兩者中顯示?我懷疑這是因爲你正在使用mutablecopy,它正在創建數據的副本 – 2011-05-06 19:08:21

0

你可以做到這一點沒有被循環之前釋放你的數組致電[hostFileOriginalArray removeObjectIdenticalTo:@"Offending"];

請注意,它會刪除多個有問題的對象,但看起來像你想要的。它也可以快速完成操作,而無需擔心要使用哪個循環的實現細節。

作爲一個通用規則(特別是對像容器和NSString這樣的真正常用的對象),請檢查類引用以查看Apple是否已經有辦法執行您想要執行的操作。它讓你的代碼對其他Cocoa用戶(包括將來你)更易讀,並且減少了代碼維護 - 現在你可以將它留給蘋果公司,以便將諸如快速枚舉等新技術添加到他們的代碼中,並且當你鏈接時你可以免費獲得它針對新版本的SDK。另外,你應該在函數的末尾返回hostFileOriginalArray,這樣它可以做一些有用的事情 - 你可以將它作爲一個自動釋放對象返回。

+0

removeObjectIdenticalTo聽起來非常像我以後。然而,我似乎無法讓它匹配的rangeOfString在我的上面的代碼中做的相同的方式。 正如你可能猜到的那樣,代碼正在編輯hosts文件,它將包含一個變化的ip地址,後面跟着一個別名。我需要刪除rangeOfString允許我做的整個行。 – Phill 2011-05-06 19:02:26

+0

啊,我錯過了它正在尋找@「Offending」作爲一個子字符串。嘗試構建NSPredicate(可能使用[NSPredicate predicateWithBlock:],如果未找到@「Offending」,則塊返回YES,或者使用可在以下網址找到的字符串匹配:http://arstechnica.com/apple/guides/2009 /04/cocoa-dev-the-joy-of-nspredicates-and-matching-strings.ars)。 – matthias 2011-05-06 19:17:41

+0

實際上,我已經能夠將有問題的行保存爲一個字符串,然後再使用removeObjectIdenticalTo刪除它。 – Phill 2011-05-06 19:19:44

0
//Remove offending entry from Array. 
[hostFileOriginalArray removeObjectAtIndex:hostFileOffendingLocation]; 

//Release the Array. 
[hostFileOriginalArray release]; 

你應該已經越來越編譯器警告......看看他們,他們通常是非常有幫助的,我總是儘量有0警告......這樣,我知道我做了什麼馬虎。