NSObject.h

版本:iOS13.5

NSObject.h

runtime其他方法通道

NSObject的协议

@protocol NSObject

//两个NSObject的对象是否相等
//会先判断两对象的哈希值是否相同
//再判断对象地址是否相同
//关于equal与hash详见最下面的引用
- (BOOL)isEqual:(id)object;
//对象的哈希值
@property (readonly) NSUInteger hash;
//对象的父类
@property (readonly) Class superclass;
//对象自身的类
- (Class)class OBJC_SWIFT_UNAVAILABLE("use 'type(of: anObject)' instead");
//对象的实例
- (instancetype)self;

//调用选择器为aSelector的方法
//返回该方法的返回值
- (id)performSelector:(SEL)aSelector;
//调用选择器为aSelector的方法
//objecct为该方法的第一个参数
- (id)performSelector:(SEL)aSelector withObject:(id)object;
//调用选择器为aSelector的方法
//objecct1为该方法的第一个参数
//objecct2为该方法的第二个参数
//若参数超过两个可使用NSInvocation
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;

//是否代理(NSProxy)
- (BOOL)isProxy;

//对象是否为aClass类或其子类的实例
- (BOOL)isKindOfClass:(Class)aClass;
//对象是否为aClass类的实例
- (BOOL)isMemberOfClass:(Class)aClass;
//对象是否符合该协议
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
//对象是否能响应该选择器,即存在该选择器的方法
- (BOOL)respondsToSelector:(SEL)aSelector;

//对象的引用计数加1(ARC模式不可用)
- (instancetype)retain OBJC_ARC_UNAVAILABLE;
//对象的引用计数减1(ARC模式不可用)
- (oneway void)release OBJC_ARC_UNAVAILABLE;
//将对象放入自动释放池(ARC模式不可用)
- (instancetype)autorelease OBJC_ARC_UNAVAILABLE;
//对象当前的引用计数(ARC模式不可用)
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;

//对象的所属内存区域(ARC模式不可用)
- (struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;

//描述信息
//当NSLog对象的时候,会输出description
@property (readonly, copy) NSString *description;

@optional
//调试时描述信息
//当在控制台 po object时 会输出debugDescription
//默认情况下debugDescription会调用description
@property (readonly, copy) NSString *debugDescription;

@end

NSObject的定义

@interface NSObject  {
    Class isa;
}

//当app一运行就会调用该方法(在main方法开始执行之前)
//每个类的load只会自动调用一次。
//由于load函数是系统自动加载的,因此不需要调用[super load]
//load与initialize详见最下面的引用
+ (void)load;

//该方法会在类或者其子类的第一个方法被调用前调用(如会在init方法之前调用)
//由于是系统自动调用,因此不需要调用 [super initialize] 
//load与initialize详见下面的引用
+ (void)initialize;
//根据分配的内存空间来初始化一个实例
- (instancetype)init

//分配内存空间并初始化一个实例
+ (instancetype)new;
//使用指定的内存区域来分配内存空间(apple不建议使用该方法)
+ (instancetype)allocWithZone:(struct _NSZone *)zone;
//使用默认的内存区域来分配内存空间
+ (instancetype)alloc;
//释放对象时会调用该方法
- (void)dealloc;

//已弃用
- (void)finalize OBJC_DEPRECATED;

//复制该对象,需实现NSCopying协议
- (id)copy;
//可变复制该对象,需实现NSMutableCopying协议
- (id)mutableCopy;

//当调用copy会调用该方法,需要重写(ARC模式不可用)
+ (id)copyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;
//当调用mutableCopy会调用该方法,需要重写(ARC模式不可用)
+ (id)mutableCopyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;

//该类是否能响应该选择器
+ (BOOL)instancesRespondToSelector:(SEL)aSelector;
//该类是否符合该协议
+ (BOOL)conformsToProtocol:(Protocol *)protocol;
//返回对象的选择器的方法实现指针
- (IMP)methodForSelector:(SEL)aSelector;
//返回该类的选择器的方法实现指针
+ (IMP)instanceMethodForSelector:(SEL)aSelector;
//当调用了没实现的方法时,若最终没有成功调用aSelector的方法,会调用该方法
//详见最下面的引用
- (void)doesNotRecognizeSelector:(SEL)aSelector;

//若resolveInstanceMethod返回NO时,可通过重写该方法,让返回的对象去执行aSelector的方法
//若返回为nil,则会调用methodSignatureForSelector
- (id)forwardingTargetForSelector:(SEL)aSelector;
//若methodSignatureForSelector返回不为nil,可通过重写该方法
//通过NSInvocation来发送消息,否则就会调用doesNotRecognizeSelector
- (void)forwardInvocation:(NSInvocation *)anInvocation;
//若forwardingTargetForSelector返回nil时,可重写该方法
//若返回不为nil,则会调用forwardInvocation
//否则会调用doesNotRecognizeSelector
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
//methodSignatureForSelector类方法
+ (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector;

//不可用
- (BOOL)allowsWeakReference UNAVAILABLE_ATTRIBUTE;
//不可用
- (BOOL)retainWeakReference UNAVAILABLE_ATTRIBUTE;

//当前类是否为aClass类或其子类
+ (BOOL)isSubclassOfClass:(Class)aClass;

//当调用了没实现的方法时,可重写该方法,在里面给该对象添加sel的方法
//返回YES让系统重新调用sel
//若返回NO,则会调用forwardingTargetForSelector
+ (BOOL)resolveInstanceMethod:(SEL)sel;
//与resolveInstanceMethod作用一致
//resolveInstanceMethod对实例方法有作用,而resolveClassMethod对类方法有作用
+ (BOOL)resolveClassMethod:(SEL)sel;

//当前类的哈希值
+ (NSUInteger)hash;
//当前类的父类
+ (Class)superclass;
//当前类的类
+ (Class)class;
//当前类的描述
+ (NSString *)description;
//当前类的调试描述
+ (NSString *)debugDescription;

@end

关于isEqual与hash可点击不要告诉我你真的懂isEqual与hash。
关于load和initialize可点击iOS类方法load和initialize详解。
关于调用未实现方法时崩溃的流程与补救可点击iOS中对unrecognized selector的防御。

你可能感兴趣的:(NSObject.h)