Вопрос по objective-c, ios, cocoa, copy – что означает свойство copy в среде Cocoa? (например, свойство items в UITabBar)

1

В 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 в массиве не были "скопированы"?

retainCount бесполезен. Не называйте это. bbum

Ваш Ответ

2   ответа
1

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

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

bar: 0x96b5ae0,1 item: 0x96b6560,2 изменяемый массив: 0x96b65b0,1 этот элемент: 0x96b6560,3 testBar.items: 0x96b6610,5 да, я думаю, вы сказали, что массив контейнера скопирован, спасибо user1610768
да, я сделал это user1610768
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.

просто тест показывает, что иногда копируют неизменяемую строку, даже не сохраняя, может быть, мы поделились определенной строкой только для одной копии в памяти, спасибо user1610768
Пояснение: массивы не будутalways быть скопированным; могут только неизменные. Если вы попытаетесь установитьitems для изменяемого массива вы обнаружите, что он установлен на копию.

Похожие вопросы