2010-01-25 2 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

ответ

6

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

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

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

+0

"Следующий шаг процесса вызовет' setEventsArray: ', который требует изменчивого массива." Что отстойно: все, что получает 'eventsArray', может мутировать его без ведома владельца. Безопасный способ делать вещи заключается в том, что свойство массива является публично неизменным, а аксессоры класса являются единственным способом мутировать массив. Эта копия необходима (перемещение ее в 'setEventsArray:' будет не медленнее), а одно в getter (чтобы вернуть неизменяемую копию изменяемого массива) можно разрезать, если такая оптимизация действительно оправдана. –

0

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

2

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

Пример кода set 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];, чтобы убедиться, что вы получаете изменяемую копию объекта.

Смежные вопросы