为什么使用[ClassName alloc]而不是[[self class] alloc]?

Nic*_*eet 17 allocation initialization objective-c self

我正在阅读Mac上的 Mark Dalrymple的Learn Objective-C(仅在Protocols的章节,所以还是相对较新的)并试图找出一些东西:

你为什么要用自己的名字引用一个类?如果我上课了Foo,为什么我要写,比方说,

[[Foo alloc] init]
Run Code Online (Sandbox Code Playgroud)

并不是

[[[self class] alloc] init]
Run Code Online (Sandbox Code Playgroud)

如果我有一个子类Bar,第一个选项不会使我无效

[[Bar alloc] init]
Run Code Online (Sandbox Code Playgroud)

而第二种选择会允许吗?第一种选择什么时候会更好?

mip*_*adi 27

通常,在类方法中,您可以使用[[self alloc] init].例如,为类编写便捷方法的规范方法是:

+ (id)fooWithBar:(Bar *)aBar
{
    return [[[self alloc] initWithBar:aBar] autorelease];
}
Run Code Online (Sandbox Code Playgroud)

(注意,在类方法中,self指的是类对象.)

但是,[[Foo alloc] init]如果您确实需要Foo类的实例(而不是子类),则可以使用(即显式类名).

  • @NHDaly:是的 - 在类方法中,`self`指的是`Class`实例. (2认同)

Max*_*ann 7

只要你想要那个类,你就可以用它的名字来引用一个类.如果子类是从该类派生的,则同一方法中的self将代表该派生类.因此,如果要显式实例化超类,可以这样做.

有时这可能是有道理的.要么强制子类重写该方法,以便返回它的类的实例.或者返回一个不同的类,比如在创建NSArray等时使用的占位符对象.