一、前言
官方對於NSObject的解釋如下:
The root class of most Objective-C class hierarchies, from which subclasses inherit a basic interface to the runtime system and the ability to behave as Objective-C objects.
大意是:這個類是大多說 Objective-C類的基類, 爲子類提供了訪問運行時系統的基本接口,並使子類具有 Objective-C對象的基本能力.
二、NSObject.h方法分類
1.加載及初始化方法
2.消息發送方法
3.複製方法
4.判斷方法
5.內存管理方法
2.1、加載及初始化方法
/** 運行時加載類或分類調用該方法, 每個類只會調用一次 */ + (void)load; /** 類實例化使用前需要先初始化, 一個類調用一次, 如果子類沒有實現該方法則會調用父類方法 */ + (void)initialize; /** 初始化對象 */ - (instancetype)init #if NS_ENFORCE_NSOBJECT_DESIGNATED_INITIALIZER NS_DESIGNATED_INITIALIZER #endif ; /** 爲新對象分配內存空間並初始化, 等於[[NSObject alloc] init] */ + (instancetype)new OBJC_SWIFT_UNAVAILABLE("use object initializers instead"); /** 爲新對象分配內存空間, 參數傳nil */ + (instancetype)allocWithZone:(struct _NSZone *)zone OBJC_SWIFT_UNAVAILABLE("use object initializers instead"); /** 爲新對象分配內存空間 */ + (instancetype)alloc OBJC_SWIFT_UNAVAILABLE("use object initializers instead");
2.2、消息發送方法
/** 發送指定的消息給對象, 返回消息執行結果(相當於方法調用) */ - (id)performSelector:(SEL)aSelector; /** 發送帶一個參數的消息給對象, 返回消息執行結果(相當於方法調用) */ - (id)performSelector:(SEL)aSelector withObject:(id)object; /** 發送帶兩個參數的消息給對象, 返回消息執行結果(相當於方法調用) */ - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2; /** 判斷實例是否能夠調用給定的方法 */ + (BOOL)instancesRespondToSelector:(SEL)aSelector; /** 判斷類是否遵從給定的協議 */ + (BOOL)conformsToProtocol:(Protocol *)protocol; /** 獲取指向方法實現IMP的指針 */ - (IMP)methodForSelector:(SEL)aSelector; /** 獲取指向實例方法實現IMP的指針 */ + (IMP)instanceMethodForSelector:(SEL)aSelector; /** 找不到函數實現的將調用此方法拋出異常 */ - (void)doesNotRecognizeSelector:(SEL)aSelector; /** 返回消息被第一個轉發的對象, 對象沒有找到SEL的IML時就會執行調用該方法 */ - (id)forwardingTargetForSelector:(SEL)aSelector OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0); /** methodSignatureForSelector:返回不爲nil則調用該方法, 可以重寫該方法將SEL轉發給另一個對象 */ - (void)forwardInvocation:(NSInvocation *)anInvocation OBJC_SWIFT_UNAVAILABLE(""); /** 獲取方法簽名, 對象沒有找到SEL的IML時就會執行調用該方法, 可以重寫該方法拋出一個函數的簽名, 再由forwardInvocation:去執行 */ - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE(""); /** 獲取實例方法簽名 */ + (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE("");
2.3、複製方法
/** 複製爲不可變對象 */ - (id)copy; /** 複製爲可變對象 */ - (id)mutableCopy;
2.4、判斷方法
/** 判斷對象是否是給定類或給定類子類的實例 */ - (BOOL)isKindOfClass:(Class)aClass; /** 判斷對象是否是給定類的實例 */ - (BOOL)isMemberOfClass:(Class)aClass; /** 判斷對象是否遵從給定的協議 */ - (BOOL)conformsToProtocol:(Protocol *)aProtocol; /** 判斷對象是否能夠調用給定的方法 */ - (BOOL)respondsToSelector:(SEL)aSelector;
2.5、內存管理方法
/** 對象引用計數加1, 在MRC下使用 */ - (instancetype)retain OBJC_ARC_UNAVAILABLE; /** 對象引用計數減1, 在MRC下使用 */ - (oneway void)release OBJC_ARC_UNAVAILABLE; /** 對象引用計數以推遲方式自動減1, 在MRC下使用 */ - (instancetype)autorelease OBJC_ARC_UNAVAILABLE; /** 獲取對象引用計數, 在MRC下使用 */ - (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;
三、源碼
#ifndef _OBJC_NSOBJECT_H_ #define _OBJC_NSOBJECT_H_ #if __OBJC__ #include <objc/objc.h> #include <objc/NSObjCRuntime.h> @class NSString, NSMethodSignature, NSInvocation; #pragma mark - 協議部分 @protocol NSObject /** 判斷兩個對象是否相等, 如相等返回YES, 否則返回NO */ - (BOOL)isEqual:(id)object; /** 獲取對象hash值, 兩對象相等hash值也相等 */ @property (readonly) NSUInteger hash; /** 獲取對象的父類 */ @property (readonly) Class superclass; /** 獲取當前對象的類 */ - (Class)class OBJC_SWIFT_UNAVAILABLE("use 'type(of: anObject)' instead"); /** 獲取當前對象 */ - (instancetype)self; /** 發送指定的消息給對象, 返回消息執行結果(相當於方法調用) */ - (id)performSelector:(SEL)aSelector; /** 發送帶一個參數的消息給對象, 返回消息執行結果(相當於方法調用) */ - (id)performSelector:(SEL)aSelector withObject:(id)object; /** 發送帶兩個參數的消息給對象, 返回消息執行結果(相當於方法調用) */ - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2; /** 判斷對象是否繼承NSObject */ - (BOOL)isProxy; /** 判斷對象是否是給定類或給定類子類的實例 */ - (BOOL)isKindOfClass:(Class)aClass; /** 判斷對象是否是給定類的實例 */ - (BOOL)isMemberOfClass:(Class)aClass; /** 判斷對象是否遵從給定的協議 */ - (BOOL)conformsToProtocol:(Protocol *)aProtocol; /** 判斷對象是否能夠調用給定的方法 */ - (BOOL)respondsToSelector:(SEL)aSelector; /** 對象引用計數加1, 在MRC下使用 */ - (instancetype)retain OBJC_ARC_UNAVAILABLE; /** 對象引用計數減1, 在MRC下使用 */ - (oneway void)release OBJC_ARC_UNAVAILABLE; /** 對象引用計數以推遲方式自動減1, 在MRC下使用 */ - (instancetype)autorelease OBJC_ARC_UNAVAILABLE; /** 獲取對象引用計數, 在MRC下使用 */ - (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE; /** 獲取對象存儲空間, 在MRC下使用 */ - (struct _NSZone *)zone OBJC_ARC_UNAVAILABLE; /** 獲取對象描述信息 */ @property (readonly, copy) NSString *description; @optional /** 獲取對象在調試器中的描述信息 */ @property (readonly, copy) NSString *debugDescription; @end #pragma mark - 類部分 OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0) OBJC_ROOT_CLASS OBJC_EXPORT @interface NSObject <NSObject> { Class isa OBJC_ISA_AVAILABILITY; } /** 運行時加載類或分類調用該方法, 每個類只會調用一次 */ + (void)load; /** 類實例化使用前需要先初始化, 一個類調用一次, 如果子類沒有實現該方法則會調用父類方法 */ + (void)initialize; /** 初始化對象 */ - (instancetype)init #if NS_ENFORCE_NSOBJECT_DESIGNATED_INITIALIZER NS_DESIGNATED_INITIALIZER #endif ; /** 爲新對象分配內存空間並初始化, 等於[[NSObject alloc] init] */ + (instancetype)new OBJC_SWIFT_UNAVAILABLE("use object initializers instead"); /** 爲新對象分配內存空間, 參數傳nil */ + (instancetype)allocWithZone:(struct _NSZone *)zone OBJC_SWIFT_UNAVAILABLE("use object initializers instead"); /** 爲新對象分配內存空間 */ + (instancetype)alloc OBJC_SWIFT_UNAVAILABLE("use object initializers instead"); /** 釋放對象, 當對象的引用計數爲0時會調用此方法 */ - (void)dealloc OBJC_SWIFT_UNAVAILABLE("use 'deinit' to define a de-initializer"); /** 垃圾回收器調用此方法前處理它所使用的內存。 */ - (void)finalize OBJC_DEPRECATED("Objective-C garbage collection is no longer supported"); /** 複製爲不可變對象 */ - (id)copy; /** 複製爲可變對象 */ - (id)mutableCopy; /** 在指定的內存空間上覆製爲不可變對象, 在MRC下使用 */ + (id)copyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE; /** 在指定的內存空間上覆製爲可變對象, 在MRC下使用 */ + (id)mutableCopyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE; /** 判斷實例是否能夠調用給定的方法 */ + (BOOL)instancesRespondToSelector:(SEL)aSelector; /** 判斷類是否遵從給定的協議 */ + (BOOL)conformsToProtocol:(Protocol *)protocol; /** 獲取指向方法實現IMP的指針 */ - (IMP)methodForSelector:(SEL)aSelector; /** 獲取指向實例方法實現IMP的指針 */ + (IMP)instanceMethodForSelector:(SEL)aSelector; /** 找不到函數實現的將調用此方法拋出異常 */ - (void)doesNotRecognizeSelector:(SEL)aSelector; /** 返回消息被第一個轉發的對象, 對象沒有找到SEL的IML時就會執行調用該方法 */ - (id)forwardingTargetForSelector:(SEL)aSelector OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0); /** methodSignatureForSelector:返回不爲nil則調用該方法, 可以重寫該方法將SEL轉發給另一個對象 */ - (void)forwardInvocation:(NSInvocation *)anInvocation OBJC_SWIFT_UNAVAILABLE(""); /** 獲取方法簽名, 對象沒有找到SEL的IML時就會執行調用該方法, 可以重寫該方法拋出一個函數的簽名,再由forwardInvocation:去執行 */ - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE(""); /** 獲取實例方法簽名 */ + (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE(""); /** 允許弱引用標量, 對於所有allowsWeakReference方法返回NO的類都絕對不能使用__weak修飾符 */ - (BOOL)allowsWeakReference UNAVAILABLE_ATTRIBUTE; /** 保留弱引用變量, 在使用__weak修飾符的變量時, 當被賦值對象的retainWeakReference方法返回NO的情況下, 該變量將使用“nil” */ - (BOOL)retainWeakReference UNAVAILABLE_ATTRIBUTE; /** 判斷是否是另一個類的子類 */ + (BOOL)isSubclassOfClass:(Class)aClass; /** 動態解析一個類方法 */ + (BOOL)resolveClassMethod:(SEL)sel OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0); /** 動態解析一個實例方法, 對象沒有找到SEL的IML時就會執行調用該方法, 可以重寫該方法給對象添加所需的SEL */ + (BOOL)resolveInstanceMethod:(SEL)sel OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0); /** 獲取對象hash值, 兩對象相等hash值也相等*/ + (NSUInteger)hash; /** 獲取對象的父類 */ + (Class)superclass; /** 獲取類 */ + (Class)class OBJC_SWIFT_UNAVAILABLE("use 'aClass.self' instead"); /** 獲取對象描述信息 */ + (NSString *)description; /** 獲取對象在調試器中的描述信息 */ + (NSString *)debugDescription; @end #endif #endif