что означает свойство copy в среде Cocoa? (например, свойство items в UITabBar)

В UITabBar.h надлежащим образом подписанная копия

@property (nonatomic, copy) NSArray * items; // получить / установить видимым

Это массив И что такое "копия"? средства? скопировать NSArray контейнер obj? скопировать каждый объект NSArray содержит? или что-то.

so there's a test
UITabBar* testBar = [[UITabBar alloc] init];
UITabBarItem* item = [[UITabBarItem alloc] init];
NSArray* array = [[NSArray alloc] initWithObjects:item, nil];

NSLog(@"bar:%p,%d", testBar, testBar.retainCount);
NSLog(@"item:%p,%d", item, item.retainCount);
NSLog(@"array:%p,%d", array, array.retainCount);

testBar.items = array;

NSLog(@"that item:%p,%d", [testBar.items lastObject], [[testBar.items lastObject] retainCount]);
NSLog(@"testBar.items:%p,%d", testBar.items, testBar.items.retainCount);
result

бар: 0x96a9750,1

пункт: 0x96aa230,2

Массив: 0x96aa280,1

этот предмет: 0x96aa230,2

testBar.items: 0x96aa280,6

почему ни контейнерный массив, ни obj в массиве не были "скопированы"?

 bbum20 авг. 2012 г., 16:16
retainCount бесполезен. Не называйте это.

Ответы на вопрос(2)

Две вещи:

collection -copy is always shallow. It doesn't copy the collections elements (In fact, nothing guarantees that these elements are even copyable – i.e. are conforming to NSCopying protocol). This explains why obj is not copied – it doesn't get any extra retain.

Foundation tries to optimizes its implementation of -copy to -retain whenever is possible. For example, -[NSString copy] is a retain for immutable strings. Since collection copies are shallow, the same optimization works for immutable collections. That's why array is not copied but just retained.

 user161076820 авг. 2012 г., 05:48
просто тест показывает, что иногда копируют неизменяемую строку, даже не сохраняя, может быть, мы поделились определенной строкой только для одной копии в памяти, спасибо
 20 авг. 2012 г., 08:34
Пояснение: массивы не будутalways быть скопированным; могут только неизменные. Если вы попытаетесь установитьitems для изменяемого массива вы обнаружите, что он установлен на копию.
Решение Вопроса

Причина, по которой копия не была сделана в этом случае, состоит в том, чтоNSArray являетсяimmutable, Вам не нужно делать его копию для защиты от изменений в массиве, потому что такие изменения не могут быть сделаны; достаточно сохранить тот же неизменный массив.

Если вы попробуете этот эксперимент сNSMutableArray, вы получите другой результат.

 user161076820 авг. 2012 г., 05:45
да, я сделал это
 user161076820 авг. 2012 г., 05:14
bar: 0x96b5ae0,1 item: 0x96b6560,2 изменяемый массив: 0x96b65b0,1 этот элемент: 0x96b6560,3 testBar.items: 0x96b6610,5 да, я думаю, вы сказали, что массив контейнера скопирован, спасибо

Ваш ответ на вопрос