指定給自定義協議引用的任何對象總是由NSObject協議直接或按超類來確認。那麼,爲什麼我應該這樣做?爲什麼要將自定義協議符合NSObject?
回答
Cocoa定義了一個NSObject協議,它反映了NSObject類和實例方法。通過聲明您的自定義協議實現NSObject協議,您可以向編譯器提供一個提示,即所有NSObject方法都將由實現您的自定義協議的實例實現。
如果您不包含NSObject協議,當您嘗試調用對象上的實例respondsToSelector的任何NSObject方法時,您將收到警告。
這聽起來像你可能會試圖問關於使用NSObject
協議,因爲每個類都有NSObject
作爲祖先。
答案是,它的不是確實每個對象都是從NSObject
派生而來的。大部分是,但NSProxy
是一個不是的例子。在NSObject
協議的方法是什麼NSObject
類的任何實例有望實現,所以通過實現NSObject
協議,NSProxy
能夠提供任何類從NSObject
(類)得出同樣的行爲已。
例如,您可以使用像-isEqual
和-hash
這樣的方法,並使用NSProxy
的實例。
如果您正在創建NSObject
類的子類,則不需要聲明您的類實現NSObject
協議,因爲NSObject
類已經爲您執行了該操作。
而且,正如你可以聲明一個類採用協議與:
@interface MyClass <SomeProtocol>
你也可以聲明一個協議採用另一種協議:
@interface MyProtocol <SomeProtocol>
因爲,如上所述,不是每類是NSObject
(該類)的子類,具有MyProtocol
採用NSObject
(該協議)保證您可以調用NSObject
方法。如果要指定方法採用任何類型的採用YourProtocol
的對象,則可以通過將類型指定爲id<YourProtocol>
來完成此操作。但是,如果YourProtocol
未聲明採用NSObject
協議,則無法確定可以安全地調用NSObject
方法(如-isEqual
),並且您甚至無法使用-respondsToSelector:
或-isKindOfClass:
檢查它是否安全,因爲這些方法本身都是部分的NSObject
協議。
這可能是我的更好的解釋!但是當我第一次潛入水中的時候,我把它看作是面對面的價值。 –
Caleb,正如你所說的,並不是每個類都是從NSObject類派生的。因此,如果我從NSObject採用MyProtocol,那麼我可以使用-isEqual,respondsToSelector :,等等。但是在這種情況下,我將不得不爲這些函數提供什麼在NSObject協議中聲明的主體。 –
只要你的類來自NSObject,你就已經有了這些方法的實現。如果它不(這將是非常不尋常的),那麼是的,你需要提供它們。 – Caleb
你不要有到。但問題在於,NSObject的許多核心功能 - 實際上,NSObject作爲基類所需的所有核心功能 - 都是在NSObject協議中聲明的。 (這個奇怪的架構使NSObject和NSProxy都可以成爲基類:它們都採用NSObject協議。)
現在,如果將對象的類型聲明爲id<MyDelegate>
,則可以發送該對象的唯一消息是MyDelegate消息。這很好,通常;但是如果你想發送它,比如說respondsToSelector:
消息呢?該方法在NSObject協議中聲明,而不是在MyDelegate協議中聲明。所以編譯器會阻止你。
有兩種解決方案。要麼將對象的類型聲明爲NSObject<MyDelegate>
,要麼使MyDelegate採用NSObject協議。無論哪種方式,現在編譯器都滿意了,您可以發送此對象的消息respondsToSelector:
。
我真的不知道,我是否知道你是對的。
如果您的意思是一個自定義協議總是確認NSObject
協議,那麼其原因很簡單。這有些奇怪:
如果您鍵入對id
的引用,編譯器會接受編譯翻譯單元(「class」,「module」,您編譯的文件)時他看到的每條消息。
如果您鍵入對id<protocol>
的對象引用,編譯器只接受在協議內聲明的消息。但這永遠不夠!
@protocol MyProtocol
@optional
- (void)doItOrNot;
@end
您可以發送的唯一信息是-doItOrNot
。所以,這樣的代碼的編譯將失敗:
id<MyProtocol> ref = …;
if ([ref respondsToSelector:@selector(doItOrNot)]) // <- Error -respondsToSelector is not declared in the protocol.
…
通過添加NSObject
協議的協議導入一些基本的聲明。 (包括MM for MRC)
如果我使用 - NSObject
當然,因爲NSObject類實現了NSObject協議。但是這是對Objective-C不需要的類的依賴。您不需要類「NSObject」,您需要該協議。 –
- 1. 必須協議符合NSObject協議?
- 2. 爲什麼有些Apple框架協議不符合<NSObject>?
- 3. 自定義UITableViewCell不符合協議UITableViewDataSource?
- 4. 爲什麼NSFetchedResultsController不符合UITableViewDataSource協議?
- 5. 爲什麼類型不符合協議?
- 6. 定義自定義協議
- 7. 自定義協議
- 8. 符合其他協議綁定協議
- 9. 爲什麼我的自定義協議會干擾ajax調用?
- 10. 無法定義一個NSObject作爲參數的協議
- 11. 我是符合UIAlertViewDelegate協議的NSObject - 是否適合釋放自己?
- 12. 符合協議?
- 13. 自定義RS485協議
- 14. 自定義協議支持
- 15. Pyside qwebview自定義協議
- 16. 自定義視圖不符合協議UICollectionViewDataSource
- 17. <NSObject>在協議
- 18. Swift3:類型「NSObject的」不符合協議「URLAuthenticationChallengeSender」
- 19. rethinkdb協議:爲什麼數字數據類型定義爲Double
- 20. 明白爲什麼在Xcode(SWIFT)「類型不符合協議」
- 21. NSObject爲什麼在NSObject和NSProxy中都聲明瞭alloc,但是保留在NSObject協議中
- 22. 符合Hashable協議?
- 23. MacRuby:符合協議
- 24. 符合CBCentralManagerDelegate協議
- 25. 符合協議,是否需要?
- 26. 定義一個符合多個協議/協議+超類的變量
- 27. 什麼是TDS協議版本8.0,爲什麼要使用它?
- 28. CustomNSError協議做了什麼,我爲什麼要採用它?
- 29. 爲什麼需要在課堂外定義一個可衡量的協議?
- 30. 符合協議的變量接受符合協議的變量
也許你可以舉個例子嗎? – Caleb
誰說你必須這樣做? – holex
你的標題應該說'符合'而不是'確認'你符合協議,你不確認。 –