2010-08-20 55 views
0

这是一个例子直接从苹果公司的文件 -什么时候应该使用Class方法而不是init实例方法?

@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”前缀。在处理类似于[[NSObject alloc] init]的Core Foundation对象'CFClassCreate'时使用Create。创建的使用意味着你负责管理内存。 – falconcreek 2010-08-20 21:01:14

+0

感谢哥们,看起来很奇怪,苹果选择在他们的文档中这样命名。 – johnrees 2010-08-22 14:26:14

回答

0

我总是在可能的地方使用类方法,因为它会减少冗长的代码,并且如果您只是简单地将对象返回给调用者,那么无论如何您都必须自动释放它,如果使用alloc获取它。

在我看来,苹果的建议措辞不佳。人们似乎认为它是一个全面禁止autorelease的禁令。事实并非如此。你只需要注意autorelease带有内存价格,但它不像你想象的那么高。除了定时器事件外,每个runloop事件都有一个新的autorelease池,在返回到runloop时会被耗尽。所以如果你知道方法会很快就没有问题了。另外,如果一个对象要超过当前事件,则不存在问题,因为autorelease池中的对象的开销很小,并且排空该池无论如何都不会释放该对象。

唯一需要注意将对象不加区分地放置在自动释放池中的情况是您需要进行大量处理以创建大量临时自动释放对象的情况。您可以通过创建自动释放池并随时消除这些方法来缓解这些方法的压力。例如

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

    // intensive processing 

    [pool drain]; 
} 
0

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

另外,在你的榜样类方法返回一个自动释放的情况下...

+0

好的,所以如果这是唯一的好处,并且因为Apple推荐使用iPhone编程,你应该尽量避免autorelease在可能的情况下... 我认为我应该放弃代码美,并坚持使用实例方法编写iOS代码时?干杯 – johnrees 2010-08-20 10:41:32

0

简短的,无益的答案是:其中是有道理。两者都不是更正确的;没有错。

一个例子可能会更多使用。

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

按照惯例返回自动释放的对象,所以使用略少打字类方法的结果:如果我是从方法返回的值,我会用类方法。

相关问题