Цель C, когда использовать alloc, а когда нет - PullRequest
5 голосов
/ 06 ноября 2011

Я пытаюсь выучить цель C, и одна из вещей, которую я нахожу очень странной, - это когда использовать alloc, а когда нет.Возьмите, к примеру, этот фрагмент кода:

NSURL *url =[NSURL URLWithString:@"http://www.apple.com"];

Почему бы вам не сделать что-то подобное, чтобы сначала выделить его?

UIAlert *alert = [[UIAlertView alloc]]

Я уверен, что есть только некоторыеОсновная вещь в цели C я пропускаю, но как ни странно, мне трудно найти объяснение без публикации.Спасибо !!

Ответы [ 2 ]

6 голосов
/ 06 ноября 2011

Проблема с +alloc заключается в том, что он сохраняет свой результат, поэтому он должен быть сбалансирован с вызовом -release или -autorelease позже.Чтобы избегать необходимости вводить это снова и снова при каждом использовании класса, разработчики API обычно создают так называемый вспомогательный конструктор или вспомогательный метод .+URLWithString: является одним из них, и внутренне это выглядит так:

+ (id)URLWithString: (NSString *)str {
    return [[[self alloc] initWithString: str] autorelease];
}

То есть +alloc получает для вас, как и -autorelease.

Справочная информация

В Objective-C существует два широких вида методов: методы класса и методы экземпляра.Методы класса отправляются самому классу и не требуют создания экземпляра этого класса.Методы экземпляра отправляются экземпляру и могут получить доступ к памяти, которую этот экземпляр занимает.Методы класса начинаются с +;Методы экземпляра с -.

+alloc - это метод класса.Это не волшебство с особыми способностями создания объектов.Все, что он делает внутри, это что-то вроде:

+ (id)alloc {
    id result = malloc(class_getInstanceSize(self));
    if (result) {
        memset(result, 0, class_getInstanceSize(self));
        result->isa = self;
        result->retainCount = 1;
    }
    return result;
}

(На самом деле это немного сложнее, но здесь этого должно быть достаточно.) Обратите внимание, что +alloc определено как часть NSObject, не часть всех объектов.Управление памятью какао с помощью +alloc, -init, -retain, -release и т. Д. Не всегда является частью Objective-C, и могут быть созданы объекты, которые не используют его.

На самом деле вы можете создавать экземпляры класса без вызова +alloc, если вы знаете правильные заклинания.Я не рекомендовал бы это.

2 голосов
/ 06 ноября 2011

Используйте метод alloc для создания нового принадлежащего вам объекта.Я имею в виду, создавая его следующим образом

NSURL *url =[[NSURL allo]initWithString:@"http://www.apple.com"], вы становитесь владельцем этого объекта.После его использования, скажем,

NSLog ("Url path is %@",url);

Вы должны освободить этот объект (URL)

[url release];

Это одна из основных тем об управлении памятью в Objective C

Как насчет вашего статуса,

NSURL *url =[NSURL URLWithString:@"http://www.apple.com"];

Я должен сказать, что система вернет URL со строкой, но вы НЕ ВЛАДЕЛИСЬ, так что вам не нужно его выпускать,потому что система автоматически освободит его (для этого объекта автоматически отправляется сообщение авто-релиза)

...