美文网首页
NSObject.h

NSObject.h

作者: 想聽丿伱說衹愛我 | 来源:发表于2020-08-21 11:20 被阅读0次

    版本: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 <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

          本文链接:https://www.haomeiwen.com/subject/mzisjktx.html