2014-06-15 41 views
0

让我考虑下面的代码:初始化方法返回的对象是怎样的?

Person *peter = [people chooseRandomPerson]; 

其中“人”是类的实例,这是已经初始化,而“chooseRandomPerson”是返回“人”类型的对象方法。我不知道它是否如下:

Person *peter = [[Person alloc] init]; 
peter = [people chooseRandomPerson]; 

如果不是,有什么区别。如果不是,我可以随时使用这种替代吗?对不起,如果问题是基本的,但我无法找到答案。

回答

1

第二个创建一个对象,将其放入变量peter,然后立即丢弃它*以存储返回值chooseRandomPerson

变量peter是一个放置东西的地方;该对象是您从alloc/initchooseRandomPerson取回的东西。你不需要创造一件事物来放置它;声明Person *peter;创建地点 - 变量 - 本身。


*如果您没有使用ARC,这将是一个泄漏,但如果你问这个你最好使用ARC。

+0

变量'peter'是放*物的地址的地方。 'alloc'创建地点。 – nhgrif

+0

当然,你是对的@nhgrif,但我认为这些指针仍然是一两个教训。 –

+1

在某个地方,某处某处通过'alloc] init过程返回的* thing *,所以我们并没有真的跳过...我们在这里没有看到它。 – nhgrif

0

answer by Josh Caswell是正确的。但你的问题并不完全清楚。

在你的问题中,你永远不会定义什么是“人”。你说你认为“对象”的“类实例”。但是什么类的对象/实例?使用复数词“人”建议收集对象。你应该在你的问题中澄清这一点。

对象创建同级对象

如果你问“的对象可以返回它自己的类的新实例?”,答案是“是”。在你的例子中,一个Person对象的“peter”可以产生一个新的Person对象,“Sally”。

但是,创建兄弟对象(同一类的新对象)的对象在我的经验中有点不寻常。更常见的情况是使用Factory design pattern来生成实例。

创建同级对象的对象有一种常见用法:Immutable objects。而不是更改DateTime对象中的一个数据字段,而是基于原始数据创建大多数数据的全新对象。