2014-06-15 42 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對象中的一個數據字段,而是基於原始數據創建大多數數據的全新對象。