zoukankan      html  css  js  c++  java
  • NSObject类的API介绍

    这篇文章围绕的对象就是NSObject.h文件,对声明文件中的属性、方法进行必要的“翻译”。

    该文件大致由两部分组成:NSObject协议和NSObject类。

    (一)NSObject协议

    - (BOOL)isEqual:(id)object;

    //这个方法的作用是判断两个对象是否相等。

    //两个对象是否相等不能简单地用“==”判断。基本数据类型用“==”可以判断,如果用在对象身上,只能判断这两个对象的地址是否相等。

    //对象是否相等的判断是比较复杂的,具体的类判断的方式还不一样。但是这个方法的重要性又很高。因此必要情况下,具体的类都有类似的“判断两个对象是否相等”的方法。比如:

    NSNumber的- (BOOL)isEqualToNumer:(NSNumber *)number;方法

    NSValue的- (BOOL)isEqualToValue:(NSValue *)value;方法

    NSString的- (BOOL)isEqualToString:(NSString *)aString;方法

    NSArray的- (BOOL)isEqualToArray:(NSArray<ObjectType> *)otherArray;方法

    等等等等

    -----------------------------------------------------------

    @property (readonly) NSUInteger hash;

    //获取对象的哈希值。

    -----------------------------------------------------------

    @property (readonly) Class superclass;

    //获取实例对象的父类。

    -----------------------------------------------------------

    - (Class)class 

    //获取实例对象的类。

    -----------------------------------------------------------

    - (instancetype)self;

    //获取实例对象自身。

    -----------------------------------------------------------

    - (id)performSelector:(SEL)aSelector;
    - (id)performSelector:(SEL)aSelector withObject:(id)object;
    - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;

    //这几个方法是OC中一种方法调用方式。使用这些方法可以向一个实例对象传递任何消息,而不需要在编译的时候声明这些方法。所以这也是runtime的一种应用方式。

    //可以参考“消息处理之performSelector”进一步了解

    -----------------------------------------------------------

    - (BOOL)isProxy;

    //判断该实例对象的类是否继承自NSObject类。返回NO则说明继承自NSObject,返回YES则说明不继承NSObject类。

    -----------------------------------------------------------

    - (BOOL)isKindOfClass:(Class)aClass;
    - (BOOL)isMemberOfClass:(Class)aClass;

    //判断该实例对象是否是aClass类的实例对象。这两个有区别

    //直接用下面的例子说明,继承关系是:Man继承于Person继承于NSObject

    -----------------------------------------------------------

    - (BOOL)conformsToProtocol:(Protocol *)aProtocol;

    //判断该实例对象的类是否实现了指定协议aProtocol中的方法。

    -----------------------------------------------------------

    - (BOOL)respondsToSelector:(SEL)aSelector;

    //判断该实例对象的类是否实现了指定方法aSelector。

    -----------------------------------------------------------

    - (instancetype)retain OBJC_ARC_UNAVAILABLE;
    - (oneway void)release OBJC_ARC_UNAVAILABLE;
    - (instancetype)autorelease OBJC_ARC_UNAVAILABLE;
    - (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;
    
    - (struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;

    //以上的五个方法是在MRC的编译环境中使用的。

    //retain:使该实例对象的引用计数加1

    //release:使该实例对象的引用计数减1

    //autorelease:使该实例对象的引用计数以推迟方式自动减1

    //retainCount:获取该实例对象的引用计数

    //zone:获取该实例对象的存储空间

    -----------------------------------------------------------

    @property (readonly, copy) NSString *description;

    //获取该实例对象的描述信息

    -----------------------------------------------------------

    @optional
    @property (readonly, copy) NSString *debugDescription;

    //获取该实例对象在调试中的描述信息

    -----------------------------------------------------------

    (二)NSObject类

    + (void)load;

    //运行时加载类或分类调用该方法,每个类只会调用一次

    -----------------------------------------------------------

    + (void)initialize;

    //类实例化使用前需要先初始化,一个类调用一次,如果子类没有实现该方法则会调用父类的此方法

    -----------------------------------------------------------

    - (instancetype)init;

    //初始化对象

    -----------------------------------------------------------

    + (instancetype)new;

    //分配内存空间并初始化新对象,相当于[[NSObject alloc] init]

    -----------------------------------------------------------

    + (instancetype)allocWithZone:(struct _NSZone *)zone;

    //指定内存空间创建一个新对象,参数可以传nil

    -----------------------------------------------------------

    + (instancetype)alloc;

    //为新对象分配内存空间

    -----------------------------------------------------------

    - (void)dealloc;

    //释放对象,当实例对象的引用计数为0时系统会自动调用此方法

    -----------------------------------------------------------

    - (void)finalize;

    //垃圾回收器处理该实例对象所使用的内存前,系统会自动调用此方法

    -----------------------------------------------------------

    - (id)copy;
    - (id)mutableCopy;

    //有名的“浅拷贝、深拷贝”15867147703

    //浅拷贝属于指针拷贝,深拷贝属于内容拷贝+指针拷贝

    -----------------------------------------------------------

    + (id)copyWithZone:(struct _NSZone *)zone;
    + (id)mutableCopyWithZone:(struct _NSZone *)zone;

    //上面的两个方法是在MRC编译环境中使用

    //第一个方法:在指定的内存空间上复制为不可变对象

    //第二个方法:在指定的内存空间上复制为可变对象

    -----------------------------------------------------------

    + (BOOL)instancesRespondToSelector:(SEL)aSelector;

    //判断实例对象是否能够调用给定的方法

    -----------------------------------------------------------

    + (BOOL)conformsToProtocol:(Protocol *)protocol;

    //判断类是否遵从给定的协议

    -----------------------------------------------------------

    - (IMP)methodForSelector:(SEL)aSelector;

    //获取指定方法实现IMP的指针

    -----------------------------------------------------------

    + (IMP)instanceMethodForSelector:(SEL)aSelector;

    //获取指定实例方法实现IMP的指针

    -----------------------------------------------------------

    - (void)doesNotRecognizeSelector:(SEL)aSelector;

    //找不到函数的实现将调用此方法抛出异常

    -----------------------------------------------------------

    - (id)forwardingTargetForSelector:(SEL)aSelector;

    //返回消息被第一个转发的对象,对象没有找到SEL的IML时就会执行调用方法

    -----------------------------------------------------------

    - (void)forwardInvocation:(NSInvocation *)anInvocation;

    //methodSignatureForSelector:返回不为nil则调用该方法,可以重写该方法将SEL转发给另一个对象

    -----------------------------------------------------------

    - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;

    //获取方法签名,对象没有找到SEL的IML时就会执行调用该方法,可以重写该方法抛出一个函数的签名,再由forwardInvocation:去执行

    -----------------------------------------------------------

    + (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector;

    //获取实例方法签名

    -----------------------------------------------------------

    - (BOOL)allowsWeakReference;

    //允许弱引用标量,对于所以该方法返回NO的类绝对不能使用__weak修饰符

    -----------------------------------------------------------

    - (BOOL)retainWeakReference;

    //保留弱引用变量,在使用__weak修饰符的变量时,当被赋值对象的该方法返回NO的情况,该变量将使用nil

    -----------------------------------------------------------

    + (BOOL)isSubclassOfClass:(Class)aClass;

    //判断该类是否是另一个类aClass的子类

    -----------------------------------------------------------

    + (BOOL)resolveClassMethod:(SEL)sel;

    //动态解析一个类方法

    -----------------------------------------------------------

    + (BOOL)resolveInstanceMethod:(SEL)sel;

    //动态解析一个实例方法,对象没有找到SEL的IML时就会执行调用该方法,可以重写该方法给对象添加所需的SEL

    -----------------------------------------------------------

    + (NSUInteger)hash;

    //获取对象的hash值

    -----------------------------------------------------------

    + (Class)superclass;

    //获取该类的父类

    -----------------------------------------------------------

    + (Class)class;

    //获取类

    -----------------------------------------------------------

    + (NSString *)description;

    //获取该对象的描述信息

    -----------------------------------------------------------

    + (NSString *)debugDescription;

    //获取对象在调试器中的描述信息

  • 相关阅读:
    周赛D. Digging for Gold(扫描线)
    CF1209F Koala and Notebook(最短路+拆点)
    P6793 [SNOI2020]字符串(后缀树上DP)
    [HEOI2016/TJOI2016]字符串(后缀自动机,可持久化线段树,线段树合并,二分答案)
    CF1166F Vicky's Delivery Service(并查集,启发式合并)
    P4248 [AHOI2013]差异(后缀树)
    CF1175F The Number of Subpermutations(单调栈,ST表)
    CF666E Forensic Examination(后缀自动机,可持久化线段树合并)
    GYM103069G. Prof. Pang's sequence
    [转]C#、VB.NET使用HttpWebRequest访问https地址(SSL)的实现
  • 原文地址:https://www.cnblogs.com/cchHers/p/11233401.html
Copyright © 2011-2022 走看看