問題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轉換最快、最方便以及最易用的框架