Почему я должен сделать изменяемую копию этого массива? - PullRequest
5 голосов
/ 25 января 2010

Apple предоставила этот пример:

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

Почему они вызывают mutableCopy здесь? Это потому, что они хотели иметь NSMutableArray, а не NSArray, чтобы редактировать / изменять его позже? Или есть другая причина?

Ответы [ 4 ]

6 голосов
/ 25 января 2010

Ответ можно найти далее в статье , в которой приведен ваш пример:

Когда контроллер табличного представления загружает свое представление, он должен извлечь объекты Event и сохранить их в массиве событий, чтобы они могли отображаться позже. Массив событий должен быть изменяемым, поскольку пользователь может добавлять и удалять события .

Блок кода в вашем примере является частью многоэтапного процесса извлечения управляемых объектов из постоянного хранилища. Следующий шаг в этом процессе вызовет setEventsArray:, для которого требуется изменяемый массив.

3 голосов
/ 25 января 2010

Если я правильно помню, использование [myObject copy] создает неизменную копию объекта по умолчанию, поэтому, если у вас есть NSMutableArray, он становится NSArray.

Поскольку в этом примере вы хотите сохранить изменчивость и, следовательно, возможность манипулировать массивом, который вы вызываете [myObject mutableCopy];, чтобы обеспечить получение изменяемой копии объекта.

2 голосов
/ 25 января 2010

Этот пример кода, вероятно, взят из «Руководства по основным данным для iPhone» документов Apple. Если так, то причина, по которой они сделали mutableCopy, заключается в том, что им нужен NSMutableArray для ivar, который определен как NSMutableArray.

Пример кода устанавливает mutableFetchResults для переменной экземпляра, как показано ниже.

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

Затем переменная экземпляра определяется следующим образом.

@interface RootViewController : UITableViewController <CLLocationManagerDelegate> {

    NSMutableArray *eventsArray;
    NSManagedObjectContext *managedObjectContext;

    CLLocationManager *locationManager;
    UIBarButtonItem *addButton;
}
0 голосов
/ 25 января 2010

Трудно сказать, почему они это сделали, не увидев пример. Единственная причина сделать это будет сделать копию массива, который вы можете изменить. Но если ваше намерение состоит в том, чтобы просто прочитать извлеченные элементы, то нет необходимости делать копию, изменяемую или нет.

...