Според това: Свойство NSString: копиране или запазване?
За NSString/NSMutableString се препоръчва копиране.
Какво ще кажете за NSArray/NSMutableArray?
Според това: Свойство NSString: копиране или запазване?
За NSString/NSMutableString се препоръчва копиране.
Какво ще кажете за NSArray/NSMutableArray?
изберете copy
, освен ако нямате много конкретна причина да не го правите, както и целия поддържащ код/интерфейс за архивиране на това.
описах обосновката и няколко извода тук: NSMutableString като retain/copy
този пример се основава на NSString
s, но същото важи и за NSArray
s.
Тъй като питате за NSArray (а не за NSMutableArray), трябва да използвате копие. NSArray е неизменен, така че не очаквате свойство от този тип да се промени. Но NSMutableArray е подклас на NSArray, така че е напълно валидно някой да предаде NSMutableArray. Ако просто запазите този обект, той може да се промени точно под носа ви. Ако копирате вместо да запазите, тогава обектът няма да се промени.
Въпреки това, трябва да сте наясно, че когато копирате контейнер като NSArray, вие копирате само контейнера, а не неговото съдържание. Ако масивът съдържа променливи обекти, съдържанието на тези обекти може да се промени, въпреки че самият масив е неизменен.
@property(copy) NSArray *myArray
е да предотврати промяната на размера на масива? Това не пречи на съдържанието да бъде променено от непослушно момче, което е преминало в NSMutableArray.
- person Pwner; 29.07.2015
@property(copy)
ще предотврати промяната на съдържанието на масива в смисъл, че масивът ще продължи да препраща към същите обекти в същия ред, но няма да попречи на самите отделни обекти да бъдат променяни.
- person Caleb; 29.07.2015
Ако това е проблем, когато основните данни се променят, използвайте копиране. Всъщност това е, което искате през повечето време, тъй като промяната на данни зад гърба на някого е добър източник за грешки.
Обърнете внимание, че копието по същество ще бъде само задържане за NSArray. Само когато поставите NSMutableArray, има повече работа.
От връзката, която включихте, до голяма степен се свежда до това: Свойство NSString: копиране или да запазите?
Ако искате да сте сигурни, че стойността на обекта няма да се промени по време на изпълнение, използвайте атрибута copy
, в противен случай retain
ще бъде добре. Като цяло retain
ще бъде добре за NSMutableArrays и NSArrays (както и много други обекти), тъй като (обикновено) се интересувате повече от обекта, отколкото от стойността, която съдържа. В случай на NSString винаги се интересувате от стойността, така че я copy
, за да сте сигурни, че няма да се промени.
@jlehr:
Зависи дали разработчикът се интересува от действителната стойност или не. Когато се интересувате от действителната стойност, използвайте copy (тъй като не искате стойността да се променя по време на изпълнение), в противен случай retain е добре. От документите на Apple:
Обичайна практика в кода на Objective-C е да се копират стойностни обекти – обекти, които представляват атрибути. Променливите от тип C обикновено могат да бъдат заменени със стойностни обекти, но стойностните обекти имат предимството да капсулират удобни помощни програми за обичайни манипулации. Например обектите NSString се използват вместо указатели на знаци, защото те капсулират кодиране и съхранение.
Също от документите на Apple, по темата за ценностните обекти:
Стойностният обект по същество е обектно-ориентирана обвивка за прост елемент от данни като низ, число или дата. Общите класове стойности в Cocoa са NSString, NSDate и NSNumber. Стойните обекти често са атрибути на други персонализирани обекти, които създавате.
copy
семантика за свойства от тип NSArray
.
- person jlehr; 02.05.2011