id 被成為萬能指針,也就是可以指向任何對象.NSObject * 本身就是定義指向NSObject類型的指針.那么這兩者有什么區(qū)別嗎?這兩者都是既可以作為返回值,又可以作為變量修飾.而其主要區(qū)別則在于id修飾的變量不遵循協(xié)議.這在實現代理模式中會體現出其區(qū)別,例如在調用代理方法時會先判斷該代理是否能夠響應某個方法? [obj respondsToSelector:]就定義在NSObject協(xié)議中.
那么,蘋果后來為什么有使用instancType呢?
我覺得主要原因有兩個,
第一,是命名問題:很多數據庫的設計,均有id字段.(當然,現在依然不能使用);
第二,instancType只能作為方法返回值,不能修飾變量.而當作為方法返回值時,它與id的主要區(qū)別是什么呢?
舉個簡單例子:
NSString *str = [Person person];
NSLog(@"%lu", str.length);
對于以上代碼,如果
[Person person]返回值為id類型,則在編輯代碼時xcode不會報錯或者警告,運行時則會崩潰(因為OC是動態(tài)檢測對象的真實類型);
反之,當其返回值為instanceType時,xcode則會報出警告.
所以,建議寫類的方法時,對于返回值,如果是id類型的話,盡量使用instanceType.