首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么使用[ClassName alloc]而不是[[self class] alloc]?

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

Stack Overflow用户
提问于 2010-08-25 02:30:40
回答 3查看 5.4K关注 0票数 18

我正在阅读Mark Dalrymple在Mac上的Learn Objective-C (仅在协议一章中,所以仍然相对较新),并试图弄清楚一些东西:

为什么要用它自己的名字来引用一个类呢?如果我有一个叫做Foo的类,为什么我要写,比如说,

代码语言:javascript
复制
[[Foo alloc] init]

而不是

代码语言:javascript
复制
[[[self class] alloc] init]

如果我有一个子类Bar,第一个选项不会使我不能写作吗

代码语言:javascript
复制
[[Bar alloc] init]

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-25 02:35:06

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

代码语言:javascript
复制
+ (id)fooWithBar:(Bar *)aBar
{
    return [[[self alloc] initWithBar:aBar] autorelease];
}

(请注意,在类方法中,self引用类对象。)

但是,如果您实际上需要Foo类的实例(而不是子类),则应使用[[Foo alloc] init] (即显式类名)。

票数 28
EN

Stack Overflow用户

发布于 2010-08-25 03:41:43

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

在某些情况下,这可能是有意义的。强制子类重写该方法,以便返回其类的实例。或者返回一个不同的类,比如在创建NSArray时使用的占位符对象等。

票数 7
EN

Stack Overflow用户

发布于 2015-10-03 05:21:51

我发现了一个条件,在这个条件下,ClassName分配和自分配是不等价的。我列出了它,以防其他人面临类似的情况。

代码语言:javascript
复制
//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后,编译器错误就消失了。这可能只是一个编译器无法消除歧义,即使上下文看起来足够清楚。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3559763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档