2010-08-20 2 views
0

Это пример прямо из документации компании Apple -Когда следует использовать метод класса вместо метода Instance Instance?

@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

Благодаря

+0

Чтобы соответствовать соглашениям об именах, опустите префикс «создать» из вашего имени метода класса. Create используется при работе с объектами Core Foundation 'CFClassCreate', который аналогичен' [[NSObject alloc] init] '. Использование create подразумевает, что вы несете ответственность за управление памятью. – falconcreek

+0

Спасибо, приятель, кажется странным, что Apple решила назвать его в своих документах. – johnrees

ответ

0

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

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

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

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

    // intensive processing 

    [pool drain]; 
} 
0

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

Кроме того, в вашем примере метод класса возвращает autoreleased экземпляр ...

+0

ОК, так что, если это единственное преимущество, и потому, что Apple рекомендует, чтобы при программировании iPhone вы старались избегать автообновления, где это возможно ... Я полагаю, что я должен отказаться от красоты кода и придерживаться методов экземпляра при написании кода iOS? ура – johnrees

0

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

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

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

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

Смежные вопросы