2010-10-20 51 views
1

我正在通過一本關於Cocoa和Objective-C的書。一個例子使我難堪:自我曾用於返回對Objective-C中類的引用嗎?

- (id) currentObject { 
    return [Photo photo]; 
} 

- (void) checkObjectType { 
    id object = [self currentObject]; 
    ... 
} 

在這種情況下,checkObjectType調用currentObject。 currentObject然後返回Photo的一個實例,但是,它創建一個Photo的新實例並返回這個引用,不是嗎?難道它不是回到自己的參考?我期待這樣的:

return self; 

感謝,

斯科特

回答

2

你一定是指斯科特史蒂文生的書。給出的例子只是試圖展示如何使用isMemberOfClass:方法。除此之外,我不會再讀到它了。

你的困惑是可以理解的。正如你已經想到的那樣,currentObject:方法返回一個新創建的自動釋放對象,而不是這個對象本身就是它的名字所暗示的。這是一個名字很差的方法。也許這只是一種提醒讀者適當地命名方法的偷偷摸摸的方式。 :)

+0

哇!我印象深刻 - 你知道那是史蒂文森從這段代碼中的書嗎?你必須有良好的記憶。謝謝你的評論。 – 2010-10-22 22:56:13

0

是,currentObject正在恢復的[Photo photo]結果。假設遵循正常的Cocoa命名約定,Photo是一個類(因爲它以大寫字母開頭),所以+photo是一個類方法(推測)返回類的一個實例。由於方法名稱不包含alloccopy,我們可以進一步推斷它返回一個自動釋放對象。

的「currentObject」方法名肯定是混淆在這種情況下,但是這樣做:

- (id) currentObject { 
    return self; 
} 

是完全沒有意義的:[self currentObject]也只是等於說self

1

我可能會把這個提起來,但這裏去...

你的代碼片段是在一個類。該類有一個名爲currentObject的方法,該方法返回一個Photo對象。

id object = [self currentObject];

這是詢問當前類self調用方法currentObject這恰好是一個Photo對象。就拿那張照片對象並將其分配給object

如果這本書的部分討論類型id那麼這似乎是一個旨在展示如何在(id)方法類似currentObject可以返回任何一種方法的靜態示例目的。

也許一個更好的例子將是:

- (id) currentObject:(NSString *)someKey { 
    return [someDictionary objectForKey:someKey]; 
} 

- (void) checkObjectType { 
    id object = [self currentObject:@"photo"]; 
    ... 
} 

凡someDictionary包含多種類似的NSString,照片和NSURL對象。 currentObject可以處理它們。

+0

好的。我明白了id變體的類型。當你說「靜態示例」時,你是什麼意思? – 2010-10-22 22:57:26

+0

如果該方法只會返回一個照片對象恕我直言,它將被定義爲這樣: - (照片)currentObject {...}如果它是返回一個對象,其中程序員不知道具體對象是什麼,它可以被定義爲 - (id)currentObject {...},因爲(id)允許它處理任何對象。就本書而言,作者可能還沒有想要解決它。 – dredful 2010-10-23 01:15:03

相關問題