2009-04-22 76 views
1

我有一个NSFoo类,有一个酒吧属性。我想要一个类方法来获取带有bar属性集的NSFoo实例。这将与NSString stringWithFormat类方法类似。所以它的签名是:如何在Objective-C中创建分配器类方法?

+ (NSFoo *) fooWithBar:(NSString *)theBar; 

所以,我只能说这是这样的:

NSFoo *foo = [NSFoo fooWithBar: @"bar"]; 

我想这可能是正确的:

+ (NSFoo *) fooWithBar:(NSString *)theBar { 
    NSFoo *foo = [[NSFoo alloc] init]; 
    foo.bar = theBar; 
    [foo autorelease]; 
    return foo; 
} 

是否正确?

+0

您可以通过在最后两行合并成回报简化它一点点[foo autorelease]; – 2009-04-22 15:44:27

+2

作为一个方面说明,NS前缀是为可可类保留的(最初是NextStep类库)。如果需要防止名称冲突,则应该为自己的类使用自己的前缀。 – 2009-04-22 20:02:56

回答

2

是的,你的实现看起来是正确的。因为-[NSObject autorelease]返回self,所以可以将return语句写为return [foo autorelease]。如果你打算使用自动释放(而不是释放),一些人建议在分配时自动释放一个对象,因为它使意图清晰,并将所有内存管理代码保存在一个地方。然后,您的方法可以写成:

+ (NSFoo *) fooWithBar:(NSString *)theBar { 
    NSFoo *foo = [[[NSFoo alloc] init] autorelease]; 
    foo.bar = theBar; 

    return foo; 
} 

当然,如果-[NSFoo initWithBar:]存在,你可能会写这个方法

+ (NSFoo *) fooWithBar:(NSString *)theBar { 
    NSFoo *foo = [[[NSFoo alloc] initWithBar:theBar] autorelease]; 

    return foo; 
} 
2

是的。它看起来不错。你的实现看起来是一种常见的做法。