Как вы относитесь к каждому из них? - PullRequest
0 голосов
/ 15 ноября 2009

Может кто-нибудь сказать мне, как я на них ссылаюсь, является ли первый управляемым объектом системы, а второй управляемым пользователем объектом, какую терминологию я должен использовать в target-c / cocoa для ссылки на каждый из них?

01

+(Planet *) planet {
    gPlanetCount++;
    return [[[self alloc] init] autorelease];
}

int main(int argc, const char * argv[]) {
    Planet *outerMost;
    outerMost = [[Planet planet] retain]; // With
    ...
    ... some code
    ...
    [outerMost release]; 
    [pool drain];
    return 0;
}

// OR

int main(int argc, const char * argv[]) {
    Planet *outerMost;
    outerMost = [Planet planet]; // Without
    ...
    ... some code
    ...
    [pool drain];
    return 0;
}

02

+(Planet *) newPlanet {
    gPlanetCount++;
    return [[self alloc] init];
}

int main(int argc, const char * argv[]) {
    Planet *outerMost;

    outerMost = [Planet newPlanet];
    ...
    ... some code
    ...
    [outerMost release];
    [pool drain];
    return 0;
}

EDIT_001

Так что в первом примере мне нужно что-то вроде этого (текст переместился на 01 вверху)

EDIT_002

"Код исправлен, окончательный пересмотренный вопрос ниже ..."

Я собираюсь пойти с 01 (учитывая, что это более обычный способ), могу ли я снова спросить о сохранении / освобождении (то есть, если они необходимы), это компилируется и проходит через статический анализатор и с ними и без них?

* 1023 Гэри *

Ответы [ 2 ]

3 голосов
/ 15 ноября 2009

В вашем первом примере результат +planet автоматически выпущен. Таким образом, вызывающий должен вызвать -retain для результата, если он хочет сохранить ссылку на результат. +planet является более распространенным шаблоном (хотя +[NSObject new] существует, в Cocoa-land встречается гораздо чаще и используется пара alloc/init или вспомогательный конструктор, такой как ваш +planet (который возвращает автоматически выпущенный экземпляр в соответствии с памятью Какао). правила управления).

В обоих примерах результат +planet / +newPlanet является экземпляром класса Planet. Нет никакой разницы в терминологии, но документация (правильного) первого примера может быть явной, чтобы указать, что результат является «автоматически выпущенным», даже если стандартные соглашения об управлении памятью Какао будут диктовать, что результат будет автоматически освобожден.

1 голос
/ 15 ноября 2009

Фактический объект , исходящий из этих методов, является просто Planet экземпляром объекта, как говорит Барри Уорк в своем ответе. Однако первый метод (+planet), вероятно, будет называться «конструктором удобства».

EDIT_001

Насколько я понимаю, объект autorelease d будет оставаться в течение всего времени, в течение которого был создан метод / функция, в которой он был создан. Вам нужно только retain объект, если вы хотите, чтобы он оставался там дольше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...