2010-01-25 54 views
5

Apple提供了這個例子:爲什麼我必須製作這個數組的可變副本?

NSError *error; 
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
if (mutableFetchResults == nil) { 
    // Handle the error 
} 

爲什麼他們在這裏調用mutableCopy?是因爲他們希望有一個NSMutableArray而不是NSArray,以便稍後編輯/更改它?還是有另一個原因嗎?

+1

很難回答,但沒有看到其他代碼。您是否嘗試搜索使用mutableFetchResults的其他行? – ewall 2010-01-25 16:18:09

回答

6

答案可以發現進一步向上以能提供您的示例article

當表視圖控制器加載其觀點,應該讀出事件的對象,讓他們在活動數組中以便以後可以顯示它們。 事件數組需要是可變的,因爲用戶可以添加和刪除事件

您示例中的代碼塊是從持久性存儲中獲取託管對象的多部分流程的一部分。該過程中的下一步將調用setEventsArray:,這需要一個可變數組。

+0

「這個過程的下一步將調用'setEventsArray:',它需要一個可變數組。」其中的任何事情:獲得'eventsArray'的任何東西都可以在沒有其所有者知識的情況下進行變異。做事的安全方式是數組屬性是公開不可變的,類的訪問器是變異數組的唯一方法。這個副本是必須的(將它移入'setEventsArray:'不會更慢),並且如果確實需要這樣的優化,則getter中的那個(返回可變數組的不可變副本)可以被切斷。 – 2010-01-26 08:12:06

0

很難說爲什麼他們沒有看到這個例子。做這件事的唯一理由是製作一個你可以修改的數組的副本。但是,如果您的意圖只是讀取提取的項目,則無需複製,修改或以其他方式。

2

此示例代碼可能來自蘋果文檔的「Core Data Tutorial for iPhone」。 如果是這樣,他們做mutableCopy的原因是他們需要將NSMutableArray定義爲NSMutableArray。

示例代碼將mutableFetchResults設置爲實例變量,如下所示。

[self setEventsArray:mutableFetchResults]; 
[mutableFetchResults release]; 
[request release]; 

然後,實例變量定義如下。

@interface RootViewController : UITableViewController <CLLocationManagerDelegate> { 

    NSMutableArray *eventsArray; 
    NSManagedObjectContext *managedObjectContext; 

    CLLocationManager *locationManager; 
    UIBarButtonItem *addButton; 
} 
3

如果我沒有記錯使用[myObject copy]默認情況下創建了一個不可變的對象副本,所以如果你有NSMutableArray它成爲NSArray。

因爲在這個例子中你想保持可變性,並因此操縱能力,你可以調用[myObject mutableCopy];來確保你得到一個可變的對象副本。

相關問題