Когда -copy возвращает изменяемый объект?

Я читал в Какао и цель C: работа и запуск , что -copy всегда будет возвращать неизменяемый объект и -mutableCopy всегда будет возвращать изменяемый объект:

Важно знать, что вызов -copy для изменяемого объекта возвращает неизменяемый объект. версия. Если вы хотите скопировать изменяемый объект и сохранить изменчивость в новой версии, вы должны вызвать -mutableCopy в оригинале. Однако это полезно, потому что, если вы хотите чтобы «заморозить» изменяемый объект, вы можете просто вызвать для него -copy .

Итак, у меня есть что-то вроде этого:

NSMutableURLRequest *req = [[NSMutableURLRequest alloc] init];
NSLog( @"%@", [req className] );               // NSMutableURLRequest
NSLog( @"%@", [[req copy] className] );        // NSMutableURLRequest
NSLog( @"%@", [[req mutableCopy] className] ); // NSMutableURLRequest

Согласно этому предыдущему ответу :

Вы не можете полагаться на то, что результат копирования будет изменяемым! Копирование NSMutableArray может вернуть NSMutableArray , поскольку это исходный класс, но копирование любого произвольного Экземпляр NSArray не будет.

Кажется, это несколько изолировано от NSURLRequest , поскольку NSArray действует как задумано:

NSArray *arr = [[NSMutableArray alloc] init];
NSLog( @"%@", [arr className] );                 // __NSArrayM
NSLog( @"%@", [[arr copy] className] );          // __NSAraryI
NSLog( @"%@", [[array mutableCopy] className] ); // __NSArrayM

Итак ...

  1. ] Когда -copy возвращает неизменяемый объект (как и ожидалось), а когда - изменяемый объект?
  2. Как добиться желаемого эффекта получения «замороженной» копии изменяемого объекта, который отказывается "замораживаться"?

9
задан Community 23 May 2017 в 11:44
поделиться