iOS開發日記56-淺析NSobject API,
今天博主有一個淺析NSobject API的需求,遇到了一些困痛點,在此和大家分享,希望能夠共同進步.
我們都知道NSObject自身遵循NSObject這個協議,從協議開始說
協議
- (BOOL)isEqual:(id)object
- 對比對象之間是否相同,地址相同,hash值也要相同,才會返回YES
@property (readonly) NSUInteger hash / + (NSUInteger)hash
- 一般用來比較,注意:新建立的執行個體之間一般不同,類的靜態方法傳回值是一樣的,比如有個類叫Man ,[Man hash]值是相同的,Man *man = [Man new]; [man hash]值不同
@property (readonly) Class superclass / + (Class)superclass
- (Class)class / + (Class)class
- (instancetype)self
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2
- 執行aSelector方法,帶參數,與[class do]這種方式比較,編譯不會報錯,只會警告,運行時檢查是否有該方法,如沒有,crash
- (BOOL)isProxy
- 檢查是否不繼承自NSObject(比如NSProxy),返回NO說明繼承
- (BOOL)isKindOfClass:(Class)aClass
- (BOOL)isMemberOfClass:(Class)aClass
- (BOOL)conformsToProtocol:(Protocol)aProtocol
+ (BOOL)conformsToProtocol:(Protocol *)protocol
- (BOOL)respondsToSelector:(SEL)aSelector
+ (BOOL)instancesRespondToSelector:(SEL)aSelector
@property (readonly, copy) NSString description
+ (NSString *)description
@property (readonly, copy) NSString *debugDescription
+ (NSString )debugDescription
- 在調試時使用po命令使用,預設實現description方法,一般用於實現更為具體的類描述,比如記憶體位址等
自身方法
+ (void)load
- 運行時載入到這個類會調用(有且僅有一次),可用來操作Swizzling Method ,調用順序是父類load ->自身load->分類load,在load中最好不要調用其他類,因為很可能其他類還沒載入結束
+ (void)initialize
- 第一次調用這個類的時候會觸發(有且僅有一次),比如[class new] ,[class alloc]。
- (instancetype)init
+ (instancetype)new
- 相當於[class alloc]init ,簡單初始化的時候可以直接new,支援點文法
+ (instancetype)allocWithZone:(struct _NSZone *)zone
- 由於曆史原因遺留下來的方法,一般不主動調用,alloc 的時候會觸發這個方法
+ (instancetype)alloc
- 返回一個已經分配好的記憶體對象 ,最好採用 [class alloc]init 這種二段式寫法,不然可能會有未知的問題,巧神說的
- (void)dealloc
- MRC時代很重要,用於類銷毀的時候釋放,清空一些變數,ARC時代基本不用重寫,除了一些計時器的銷毀或者通知的移除等等。
- (void)finalize
- (id)copy
- (id)mutableCopy
- 可變的拷貝
@property (copy) NSMutableArray array 或
NSMutableArray array = [array copy]是錯誤的 ,經過copy,array變成了不可變的,後續操作會引發crash
- (IMP)methodForSelector:(SEL)aSelector
+ (IMP)instanceMethodForSelector:(SEL)aSelector
- 擷取aSelector方法指標,用法:頻繁調用某個方法,可以利用這自己組裝成方法,提高效能
- (void)doesNotRecognizeSelector:(SEL)aSelector
- (BOOL)allowsWeakReference
- (BOOL)retainWeakReference
- OC中有一些類,並不支援ARC,例如NSMachPort類。可以通過此方法來判斷是否支援ARC
+ (BOOL)isSubclassOfClass:(Class)aClass
有關訊息轉寄
unrecognized selector sent to instance,這種錯誤應該不少見,調用了類不存在的方法導致Crash,在崩潰前我們有三次機會挽救一下
1.自救(動態增加方法)
- (BOOL)resolveInstanceMethod:(SEL)sel
2.轉寄其他類
- (id)forwardingTargetForSelector:(SEL)aSelector
3.形成簽名然後轉寄
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
- (void)forwardInvocation:(NSInvocation *)anInvocation