[iOS]NSObject,id, instancetype 需要清晰的了解他們

問題1:

OC里面已經有NSObject了,為啥還要用id,
所有對象不知道類型的時候用NSObject代替不可以么?

問題2:

很多初始化的時候,init方法里,返回為何用id,
會有什么樣的優勢和劣勢,如何解決存在的問題?

問題3:

單例模式作為常見的一個模式,目前代碼里每次都用GCD+oncetoken的方式寫這樣一段代碼? 
能否將這個東西變得簡單一點?
讓代碼里任何地方想用單例都可以很方便的調用?

問題4:

json作為常見的傳輸格式,在OC里面,經常需要解析轉化為model,
是否有好的方法,將其統一起來,如何實現?

拋磚引玉

polen:

問題1:

OC里面已經有NSObject了,為啥還要用id,所有對象不知道類型的時候用NSObject代替不可以么?

不可以,因為OC里面,并不是所有的Foundation/Cocoa對象都繼承息NSObject
比如NSProxy就不從NSObject繼承。
所以你無法使用NSObject*指向這個對象,
即使NSProxy對象有release和retain這樣的通用方法。

參照:iOS開發中很重要,很常用,但卻容易被忽略的知識點:id ,NSObject, id<NSObject>區別

1. id foo1;
2. NSObject *foo2;
3. id<NSObject> foo3;
這3種究竟什么區別

問題2:

很多初始化的時候,init方法里,返回為何用id,會有什么樣的優勢和劣勢,如何解決存在的問題?

id的優勢是,id可以直接強轉化為其他各個格式。
如同題目1的場景,如果是用NSObject,那么,有些類是無法強轉過去的(比如不繼承NSObject類的)

劣勢是:
就是因為可以強轉,可能會出現莫名轉到其他非期望的類里面去,
這個錯誤在編譯階段是發現不了的
只有運行的時候,才可能暴露

解決方案:
用instancetype

instancetype的作用,就是使那些非關聯返回類型的方法返回所在類的類型!

參照:Objective-C中的instancetype和id區別

問題3:
單例模式作為常見的一個模式,目前代碼里每次都用GCD+oncetoken的方式寫這樣一段代碼? 能否將這個東西變得簡單一點?讓代碼里任何地方想用單例都可以很方便的調用?

需要好好思考下...

參照:從 Objective-C 里的 Alloc 和 AllocWithZone 談起

問題4:
json作為常見的傳輸格式,在OC里面,經常需要解析轉化為model,是否有好的方法,將其統一起來,如何實現?

1.這里面用到幾個點,首先是根據runtime的屬性,可以遍歷一個類的所有成員變量
2.解析方式:遞歸
3. json里面可能有Dictionary,可能與Array可能有數組,那么解析的時候,如何去確認這個是哪種類?
答:建立一個class的變量(@property),里面包含一個參數,就是“類型”(即className),比較簡單的方式,當然也有更好的方式,可以探討

說明:
// 獲取所有屬性 
class_copyPropertyList 
說明:使用class_copyPropertyList并不會獲取無@property聲明的成員變量

// 獲取屬性特性描述字符串 
property_getAttributes 
// 獲取屬性名 
property_getName 
// 獲取所有屬性特性 
property_copyAttributeList

參照:MJExtension是M了個J這哥們做的,大家可以參照下
但是,本質更多的是希望,做之前我們自己思考怎么去實現這樣一個東西... "拿來即用并不是目的..."
MJExtension是JSON和Model轉換最快、最方便以及最易用的框架

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容