五、Objective-C 类NSObject
认识类NSObject
1.1、根类的作用
首先提个概念,运行时系统:类似OC的操作系统,负责完成对象的生成、释放时的内存管理、为发来的消息查对应的处理方法。
NSObject根类方法提供了运行时系统的基本功能
1.2、NSObject中类和实例变量的相关方法。
NSObject只有一个实例变量,Class类型的变量isa,用来标示对象属于哪个类对象。子类不能修改isa也不可直接访问,通过方法class来完成查询。
以下就是类和实例变量的相关方法的说明。
- (Class) class 返回消息接受者所属的类对象
+ (Class) class // 返回类对象,可以用类名调用此方法。注意当类对象时其他消息的参数,或者将类对象赋值给变量的时候,需要通过这个类方法来获取类对象,也就是需要类对象转换。
- (id) self // 返回接受者自身
- (BOOL) isMemberOfClass: (Class) aClass // 判断消息接受者是不是传入参数aClass的对象
+ (BOOL) isKindOfClass: (Class) aClass // 判断消息接收者是不是传入参数aClass类或者aClass的子类的实例。此方法和isMemberOfClass的区别在于使子类的时候也会返回YES
+ (BOOL) isSubclassOfClass: (Class) aClass // 判断消息接受者是不是传入参数aClass的子类或自身
- (Calss) superclass // 返回消息接收者所在类的父类的类对象
+ (Class) superclass // 返回消息接收类所在父类的类对象
理解下面这个例子,你就掌握这个知识点了
People *people = [[People alloc] init];
Student *student = [[Student alloc] init];
BOOL a = [people isKindOfClass:[People class]];
BOOL b = [people isKindOfClass:[NSObject class]];
BOOL c = [student isMemberOfClass:[Student class];
BOOL d = [student isMemberOfClass:[NSObject class]];
BOOL aa = [(id)[NSObject class] isKindOfClass:[NSObject class]];
BOOL bb = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
BOOL cc = [(id)[Student class] isKindOfClass:[People class]];
BOOL dd = [(id)[Student class] isMemberOfClass:[Student class]];
以上代码,a,b,c为YES,d为NO、 aa为YES,bb,cc,dd为NO
adbcd好理解,主要是后面,(id)[NSObject class] 是一个类对象的实例,每个类只有一个类对象
NSObject * obj =[ [NSObject alloc] init];
Class objClass = [obj class];
objClass isKindOfClass:[NSObject class] //类对象也是一个对象,所以它可以作为NSObject的某个子类的对象来使用。所以这样为YES
1.3、实例对象的生成和释放
+ (id) alloc // 生成消息接收类的实例对象。通常和init或init开头的方法连用。子类中不允许重写alloc方法。
- (void) dealloc // 释放对象,作为对象release的结果调用。只能在子类中重写,不能直接调用此方法。
和实例对象相关的其它方法,多数用来引用计数或者垃圾回收。ARC下都不用,所以省略。
1.4、初始化
- (id) init // init可对alloc生成的实例对象进行初始化,子类可以复写或者定义新的init开头的初始化函数
+ (void) initialize // 被用于类的初始化。在类收到消息之前就会自动调用,不允许手动调用。
+ (id) new // new使alloc和init方法的结合。根据类的实现的不同,new方法不会每次都返回一个全新的实例对象,有时new方法会返回对象池中预先生成的对象,也有可能每次都返回同一个对象。
1.4、对象的比较
- (BOOL) isEqual: (id) anObject // 消息的接受者如果和参数anObject相等就返回YES
1.5、对象的描述
+ (NSString *) description // 返回消息接受者所属类的内容。通常都是这个类的名字。
- (NSString *) description // 返回消息接受者实例对象的内容。通常是类名加id值。子类中可以重新定义description的返回值。通常我们复写它来方便打印