2014-09-06 48 views
0

我目前正在使用需要我使用id<ISPInitListener>的API(Insiteo)。它告訴我的初始化函數中使用它:什麼是一個id <>變量,並自動初始化?

id<ISPCancelable> initTask = [[ISInitProvider instance] startAPIWithServerType:ISEServerTypeProd andSiteId:SITE_ID andLanguage:LANGUAGE andInitListener:aListener]; 

其中「aListener」是id<ISPInitListener>。我可以看到ISPInitListenerNSObject,但實際上並不知道在此函數中初始化/使用它的最佳方式?任何人都可以解釋這些對象是如何工作的嗎?

我目前有ISPInitListener這裏增加@interface LONetworkLocationManager() <UITextViewDelegate, UIAlertViewDelegate, ISPInitListener>但與ISP相關的委託功能永遠不會被調用。

任何幫助,非常感謝。

回答

1

id是Objective-C中的「任何對象類型」的特殊類型。

角括號用於表示協議一致性。

把兩者放在一起,id<ISPInitListener>表示「符合ISPInitListener協議的任何物體」。

這通常用於指示委託對象的類型,其中您不關心對象的特定類型,但僅關心與定義特定委託的協議的一致性,在此例中爲ISPInitListener

+0

謝謝,這很好地清理它 – 2014-09-06 13:26:05

0

好吧,我想我找到了答案,這在http://unixjunkie.blogspot.co.uk/2008/03/id-vs-nsobject-vs-id.html

聲明一個對象作爲ID告訴你不在乎什麼類型的對象是編譯器,但你不在乎它是否符合到指定的NSObject協議**。編譯器將確保您分配給該指針的所有對象都符合所需的協議。類似於這樣的指針可以安全地容納任何NSObject(因爲NSObject符合NSObject協議),但它也可以容納任何NSProxy,因爲NSProxy也符合NSObject協議。在英語中,聲明id foo3;說「foo3是一個指向任何類型的對象的行爲像一個NSObject」。這是非常強大,方便和富有表現力的。實際上,我們通常不關心對象是什麼類型,我們只關心它響應我們想要發送的消息(例如保留,釋放)。