Когда я должен использовать метод класса вместо метода экземпляра init? - PullRequest
0 голосов
/ 20 августа 2010

Это пример прямо из документации Apple -

@implementation MyClass

- (id)initWithString:(NSString *)aName
{
    self = [super init];
    if (self) {
        name = [aName copy];
    }
    return self;
}

+ (MyClass *)createMyClassWithString: (NSString *)aName
{
    return [[[self alloc] initWithString:aName] autorelease];
}
@end

Поскольку в любом случае я буду создавать новый объект MyClass, я хочу знать, почему я мог бы использовать класс Метод createMyClassWithString:aName вместо Метод экземпляра initWithString:aName

Спасибо

Ответы [ 3 ]

0 голосов
/ 20 августа 2010

Короткий, бесполезный ответ: где смысл. Ни один не является более правильным; ни то, ни другое не верно.

Пример может быть более полезным. Я бы использовал метод класса, если бы возвращал значение из метода:

- (MyClass*) doStuff {
  MyClass* retv = [MyClass createMyClassWithString:@"Simon says"];
  [retv someOtherMethod];
  return retv;
}

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

0 голосов
/ 20 августа 2010

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

На мой взгляд, совет от Apple был плохо сформулирован. Люди, кажется, воспринимают это как полный запрет на авто-релиз. Это просто не тот случай. Вы просто должны помнить, что авто-релиз идет с ценой памяти, но он не так высок, как вы думаете. Каждое событие runloop, кроме событий timer, поставляется с новым пулом автоматического выпуска, который очищается при возврате в runloop. Так что, если вы знаете, что метод будет быстрым, нет проблем. Кроме того, если объект собирается пережить текущее событие, это не проблема, поскольку накладные расходы на объект в пуле автоматического выпуска довольно малы, и его истощение не приведет к освобождению объекта в любом случае.

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

while(someCondition)
{
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    // intensive processing

    [pool drain];
}
0 голосов
/ 20 августа 2010

Единственная причина - читаемый и красивый код ...

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

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