我正在阅读Mark Dalrymple在Mac上的Learn Objective-C (仅在协议一章中,所以仍然相对较新),并试图弄清楚一些东西:
为什么要用它自己的名字来引用一个类呢?如果我有一个叫做Foo的类,为什么我要写,比如说,
[[Foo alloc] init]而不是
[[[self class] alloc] init]如果我有一个子类Bar,第一个选项不会使我不能写作吗
[[Bar alloc] init]而第二种选择会允许它吗?什么时候第一个选项会更好?
发布于 2010-08-25 02:35:06
通常,在类方法中,可以使用[[self alloc] init]。例如,为类编写方便方法的规范方法是:
+ (id)fooWithBar:(Bar *)aBar
{
return [[[self alloc] initWithBar:aBar] autorelease];
}(请注意,在类方法中,self引用类对象。)
但是,如果您实际上需要Foo类的实例(而不是子类),则应使用[[Foo alloc] init] (即显式类名)。
发布于 2010-08-25 03:41:43
只要你想要一个类,你就可以通过它的名字来引用它。如果子类是从该类派生的,则同一方法中的self将表示该派生类。因此,如果你想显式地实例化一个超类,这是可以做到的。
在某些情况下,这可能是有意义的。强制子类重写该方法,以便返回其类的实例。或者返回一个不同的类,比如在创建NSArray时使用的占位符对象等。
发布于 2015-10-03 05:21:51
我发现了一个条件,在这个条件下,ClassName分配和自分配是不等价的。我列出了它,以防其他人面临类似的情况。
//Option 1
+ (NSInputStream *)streamWBlockWithArray:(NSArray *)dataArray
{ return [[[self alloc] initWithArray:dataArray] autorelease]; }
// Option 2
+ (NSInputStream *)streamBlockWithArray:(NSArray *)dataArray
{ return [[[Block alloc] initWithArray:dataArray] autorelease]; }如果我使用选项1,编译器会给出一个重复定义的编译器错误。initWithArray的定义被标记为与+ NSArray initWithArray中的定义冲突。在我将self alloc替换为Block alloc后,编译器错误就消失了。这可能只是一个编译器无法消除歧义,即使上下文看起来足够清楚。
https://stackoverflow.com/questions/3559763
复制相似问题