Цель C, когда использовать alloc, а когда нет

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

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

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

UIAlert *alert = [[UIAlertView alloc]]

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

2 ответа

Решение

Проблема с +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 если вы знаете правильные заклинания. Я бы не рекомендовал это.

Используйте метод 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 со строкой, но вы им НЕ ВЛАДЕЕТЕ, поэтому вам не нужно освобождать его, потому что система автоматически освободит его (для этого объекта автоматически отправляется сообщение об автоматическом освобождении)

Другие вопросы по тегам