Создание эффективных для памяти объектов в Objective-C - PullRequest
0 голосов
/ 08 марта 2012

Предположим, у меня есть объект "Контакт" только с именем и фотографией.

@interface Contact: NSObject
{
    NSString *name;
    UIImage *photo;
}
@property (copy) NSString name;
@property (copy) UIImage photo;

Предположим, что я живу в месте, где у меня есть 1000 человек по имени Сэм, и они все клоны, поэтому их фотография выглядит точното же самое, и я решил обмануть и использовать одну и ту же фотографию для всех них.

Достаточно ли уменна цель C, чтобы при получении копии имени и фотографии она распознала, что она имеет одинаковое значение и может бытьобрабатывается одним объектом и выделяет только одну NSString и один UIImage для всех Самсов?

Как правильно это сделать?Очевидно, мне нужно настроить их свойства копирования для обработки случаев, отличных от Сэма, и в случае, если мне передают изменяемые строки и изображения.

Ответы [ 2 ]

1 голос
/ 08 марта 2012

UIImage не соответствует протоколу NSCopying, поэтому вопрос довольно спорный.Вам нужно изменить copy в свойстве photo на retain.Это прекрасно для вас, так как UIImage в любом случае не является изменяемым (и не имеет изменяемых подклассов), поэтому копировать его не нужно.

Что касается имени, вызывается -copy для неизменных объектовкоторый поддерживает копирование), как правило, просто сохраняет объект, а не копирует его.Вызов его для изменяемого варианта этих объектов (например, NSMutableString) создаст неизменную копию (которая сама ответит на последующие -copy запросы путем сохранения).Обратите внимание, однако, что при вызове -copy для изменяемого объекта несколько раз будут создаваться различные неизменяемые копии.

0 голосов
/ 08 марта 2012

Если вы используете [UIImage imageNamed:], то SDK кеширует фотографию для вас и использует ее повторно. Кроме того, поскольку UIImage является неизменяемым, вы не сможете изменить его после загрузки в память.

Объекты изображений неизменны, поэтому вы не можете изменять их свойства после создания. Это означает, что вы обычно указываете свойства во время инициализации или полагаться на метаданные изображения для укажите стоимость недвижимости.

Если вы хотите, чтобы ваш Контакт соответствовал NSCopying, просто убедитесь, что вы используете копию NSString при дублировании ваших объектов.

...