我什么时候应该使用Class Method而不是init Instance Method?

时间:2010-08-20 10:26:25

标签: iphone objective-c cocoa-touch xcode

这是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 :(得分:0)

唯一的原因是可读和漂亮的代码...

此外,在您的示例中,类方法返回一个自动释放的实例...

答案 1 :(得分:0)

简短而无益的答案是:哪里有道理。两者都不正确;也没错。

一个例子可能更有用。如果我从方法中返回值,我会使用类方法:

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

按照惯例,您返回自动释放的对象,因此使用class方法会导致输入的次数略少。

答案 2 :(得分:0)

我总是在可能的情况下使用类方法,因为它会导致更简洁的代码,如果你只是将对象返回给调用者,你还是必须自动释放它,如果你用alloc获得它。

在我看来,苹果的建议措辞不力。人们似乎将其视为全面禁止自动释放。事实并非如此。你必须要注意自动释放​​带有内存价格,但它没有你想象的那么高。除定时器事件之外的每个runloop事件都带有一个新的自动释放池,在返回runloop时会被耗尽。所以如果你知道方法很快就没问题了。此外,如果一个对象将比当前事件更长,那么没有问题,因为自动释放池中的对象的开销非常小,并且耗尽池也不会解除对象的反对。

唯一需要注意将对象无差别地放入自动释放池的情况是您需要进行密集处理才能创建大量临时自动释放的对象。您可以通过创建自动释放池并在进行时排空它们来减轻这些方法的压力。 e.g。

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

    // intensive processing

    [pool drain];
}