iOS NSObject api注解

***************  NSObject协议
一   NSObject 协议(@protocol NSObject)

@property (readonly) NSUInteger hash;
@property (readonly) Class superclass;
@property (readonly, copy) NSString *description;
@property (readonly, copy) NSString *debugDescription;

- (BOOL)isEqual:(id)object;
- (instancetype)self;
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector
           withObject:(id)object1
           withObject:(id)object2;

- (BOOL)isProxy;
- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
- (BOOL)respondsToSelector:(SEL)aSelector;



 
 *************** NSObject类
二 NSObject类
 1.1 NSObject内部结构定义如下:
   @interface NSObject  {
        Class isa  OBJC_ISA_AVAILABILITY;
   }
   NSObject作为根类,指向实际的对象,且将isa指针指向了实际对象的类;
 

+ (void)load;
+ (void)initialize;
    load是只要类所在文件被引用就会被调用,而initialize是在类或者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么initialize也不会被调用

 
******* 对象的创建与初始化
 2.1 对象创建并且调用init初始化:
    + (instancetype)new;

 2.2 对象分配内存
     + (instancetype)allocWithZone:(struct _NSZone *)zone;
     + (instancetype)alloc;
     在发送+alloc消息时,会查看该类极其继承的类是否具有该方法,如果有,则isa指针指向其类对象;

 2.3 对象初始化
     - (instancetype)init;
     这是默认的一个初始化方法,程序员可以自己定义初始化方法,不过必须以initWith...开头
 
 2.4 对象销毁时调用的方法
     - (void)dealloc;
     主要是在这个方法中进行其他资源的释放;
 
 2.5 对象的复制
    - (id)copy;
    - (id)mutableCopy;

 2.6 判断该对象是否实现了该方法,是否实现了该协议
    //是否实现了该方法
    + (BOOL)instancesRespondToSelector:(SEL)aSelector;
    //是否实现了该协议
    + (BOOL)conformsToProtocol:(Protocol *)protocol;
 
 2.7 获取该对象中某个SEL对应的IMP
    - (IMP)methodForSelector:(SEL)aSelector;
    + (IMP)instanceMethodForSelector:(SEL)aSelector;
    selector表示一个成员方法的hash值,在一个对象方法集合中是唯一的;IMP是一个函数指针,表示oc中成员方法的实际实现;
    selector和IMP存在对应关系,即methodLists中的Method;
 
 
 
******* 获取对象所属类,以及父类
 3.1 获取hash值,这个没用过
     + (NSUInteger)hash;

 3.2 获取对象本身
     - (instancetype)self;
     关于super关键字,其实也是指向的this,不过由于msgSendSuper方法发送的消息;

 3.3 获取本对象所属类
     + (Class)class;

 3.4 获取本对象的父类
     + (Class)superclass;
 
       关于MetaClass元类,即所属类对象的类对象;理论上[[self class] class]是获取元类metaClass;
    但是实际上这个获取是失败的; 通过以下方式中一种获取metaClass元类
       1) Class objc_getMetaClass(const char *name)
       2) Class metaClass =  object_getClass(object_getClass(self))
        
       顺便提一句: 对象的实例成员方法是放在类对象中的methodList中的,对象的类方法是放在metaClass元类
    对象的methodList中的;
 



 ********* 判断继承关系

 4.1 判断两个对象的内存地市是否相等(即是否是同一个对象)
    - (BOOL)isEqual:(id)object;
 4.2 判断一个类是否是其子类
    + (BOOL)isSubclassOfClass:(Class)aClass;
 4.3 判断一个类是否是属于这个类 ( 该对象属于该类,以及父类,祖先类 )
    - (BOOL)isKindOfClass:(Class)aClass;
 4.4 判断一个类是否就是该类 ( 不包括该对象的父类,祖先类 )
    - (BOOL)isMemberOfClass:(Class)aClass;
 
 **************perform系列方法
//不携带参数
- (id)performSelector:(SEL)aSelector;
//携带参数
- (id)performSelector:(SEL)aSelector withObject:(id)object;
//携带两个参数
- (id)performSelector:(SEL)aSelector
           withObject:(id)object1
           withObject:(id)object2;
    这三个函数可以调用“方法”,且该“方法“在编译器件不会检查;


******* 打印输出函数内部信息 一般需要重写该方法;
 
 5.1 当NSLog打印该对象时,会调用description方法
    + (NSString *)description;
 5.2 当DEBUG模式下,(PO 对象)时,会调用debugDescription方法
    + (NSString *)debugDescription;
 


 
****** 消息重定向
步骤1 SEL重解析(在步骤一,可以重新为selctor绑定一个IMP)
    + (BOOL)resolveClassMethod:(SEL)sel;
    + (BOOL)resolveInstanceMethod:(SEL)sel;
 
步骤2 备用接受者 (在步骤二,可以重新指定一个receiver)
    - (id)forwardingTargetForSelector:(SEL)aSelector ;
 
步骤3 完全转发 ( 在步骤三,可以重新指定receiver,以及selector, imp )
    - (void)forwardInvocation:(NSInvocation *)anInvocation;
    - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
    + (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector;
 
步骤4 unrecognize selector崩溃点 (如果来到步骤4,必然crash )
    - (void)doesNotRecognizeSelector:(SEL)aSelector;



你可能感兴趣的:(IOS)