Objective-C - разница между alloc и allocFromZone?

Возможный дубликат:
в чем разница между alloc и allocWithZone:?

Я прочитал статью, в которой упоминается, что использование allocWithZone помогает повысить производительность за счет использования области памяти ближе к самому объекту. Это правда? и рекомендуется ли использовать allocWithZone вместо alloc? В чем разница между alloc и allocWithZone?

Доказанный пример был:

- (id)init
{
   if (self = [super init])
   {
      _myString = [[NSString allocWithZone:[self zone] init]];
   }

   return self;
}

person aryaxt    schedule 16.11.2011    source источник


Ответы (2)


Первый ARC запрещает вызов zone для объектов. Поскольку все движется таким образом, это кажется достаточно веской причиной, чтобы не использовать allocWithZone.

Я знаю одно хорошее применение allocWithZone, соответствующее NSCopying.

@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end

И хотя вы можете полностью игнорировать параметр зоны, мне нравится делать что-то вроде:

-(id)copyWithZone:(NSZone *)zone{
    SampleClass *copy = [[SampleClass allocWithZone:zone] init];
    copy->_myString = [_myString copyWithZone:zone];
    return copy;
}

Кроме этого, я не думаю, что можно сказать что-то большее, чем опубликованный предыдущий вопрос.

person NJones    schedule 16.11.2011

Прямо из рот лошади:

Больше нет необходимости использовать NSZone — они все равно игнорируются современной средой выполнения Objective-C.

(Это из примечаний к выпуску ARC для всех, кто читает это после того, как Apple снова нарушит структуру своей документации.)

Зоны памяти когда-то были чем-то полезны, но Cocoa довольно основательно от них отошел. NSZone подобен рудиментарному хвосту, и и ARC, и libauto GC отрезали его. Как отметил инженер Apple Билл Бамгарнер в комментариях к обману Брайанмака, они были просто громоздкими и не очень эффективно использовались в Cocoa.

person Chuck    schedule 16.11.2011