Свойство NSArray: копиране или запазване?

Според това: Свойство NSString: копиране или запазване?

За NSString/NSMutableString се препоръчва копиране.

Какво ще кажете за NSArray/NSMutableArray?


person Howard    schedule 01.05.2011    source източник


Отговори (4)


изберете copy, освен ако нямате много конкретна причина да не го правите, както и целия поддържащ код/интерфейс за архивиране на това.

описах обосновката и няколко извода тук: NSMutableString като retain/copy

този пример се основава на NSStrings, но същото важи и за NSArrays.

person justin    schedule 01.05.2011

Тъй като питате за NSArray (а не за NSMutableArray), трябва да използвате копие. NSArray е неизменен, така че не очаквате свойство от този тип да се промени. Но NSMutableArray е подклас на NSArray, така че е напълно валидно някой да предаде NSMutableArray. Ако просто запазите този обект, той може да се промени точно под носа ви. Ако копирате вместо да запазите, тогава обектът няма да се промени.

Въпреки това, трябва да сте наясно, че когато копирате контейнер като NSArray, вие копирате само контейнера, а не неговото съдържание. Ако масивът съдържа променливи обекти, съдържанието на тези обекти може да се промени, въпреки че самият масив е неизменен.

person Caleb    schedule 01.05.2011
comment
@Caleb Така че единственото предимство на @property(copy) NSArray *myArray е да предотврати промяната на размера на масива? Това не пречи на съдържанието да бъде променено от непослушно момче, което е преминало в NSMutableArray. - person Pwner; 29.07.2015
comment
@Pwner @property(copy) ще предотврати промяната на съдържанието на масива в смисъл, че масивът ще продължи да препраща към същите обекти в същия ред, но няма да попречи на самите отделни обекти да бъдат променяни. - person Caleb; 29.07.2015

Ако това е проблем, когато основните данни се променят, използвайте копиране. Всъщност това е, което искате през повечето време, тъй като промяната на данни зад гърба на някого е добър източник за грешки.

Обърнете внимание, че копието по същество ще бъде само задържане за NSArray. Само когато поставите NSMutableArray, има повече работа.

person Eiko    schedule 01.05.2011

От връзката, която включихте, до голяма степен се свежда до това: Свойство NSString: копиране или да запазите?

Ако искате да сте сигурни, че стойността на обекта няма да се промени по време на изпълнение, използвайте атрибута copy, в противен случай retain ще бъде добре. Като цяло retain ще бъде добре за NSMutableArrays и NSArrays (както и много други обекти), тъй като (обикновено) се интересувате повече от обекта, отколкото от стойността, която съдържа. В случай на NSString винаги се интересувате от стойността, така че я copy, за да сте сигурни, че няма да се промени.

@jlehr:

Зависи дали разработчикът се интересува от действителната стойност или не. Когато се интересувате от действителната стойност, използвайте copy (тъй като не искате стойността да се променя по време на изпълнение), в противен случай retain е добре. От документите на Apple:

Обичайна практика в кода на Objective-C е да се копират стойностни обекти – обекти, които представляват атрибути. Променливите от тип C обикновено могат да бъдат заменени със стойностни обекти, но стойностните обекти имат предимството да капсулират удобни помощни програми за обичайни манипулации. Например обектите NSString се използват вместо указатели на знаци, защото те капсулират кодиране и съхранение.

Също от документите на Apple, по темата за ценностните обекти:

Стойностният обект по същество е обектно-ориентирана обвивка за прост елемент от данни като низ, число или дата. Общите класове стойности в Cocoa са NSString, NSDate и NSNumber. Стойните обекти често са атрибути на други персонализирани обекти, които създавате.

person Wolfgang Schreurs    schedule 01.05.2011
comment
Споделянето на съдържанието на променливи колекции между два или повече обекта нарушава капсулирането, което е причината Apple да препоръчва използването на copy семантика за свойства от тип NSArray. - person jlehr; 02.05.2011