*************** 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 <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 NSObject api注解
最新推荐文章于 2024-06-06 22:04:05 发布