第08章 类NSObject和运行时系统 上
本章将对根类NSObject的主要功能和NSObject与运行时系统之间的关系进行说明
8.1 类NSObject
8.1.1 根类的作用
作为一门动态语言Objective-C有很多动态的特征,因此,Objective-C不仅需要编译环境,同时还需要一个运行时系统(runtime system)来执行编译好的代码。运行时系统扮演的角色类似于Objective-C的操作系统,它负责完成对象生成、释放时的内存管理,未发来的消息查找对应的处理方法等。
通常情况下,程序中无法直接使用运行时系统提供的功能。根类方法中提供了运行时系统的基本功能。继承了NSObject的所有类都可以自由地使用的运行时系统的功能,也就是说,根类就相当于运行时系统的一个接口。
8.1.2 类和实例
NSObject是有一个实例变量,就是Class类型的变量isa。isa用于标识实例对象属于哪个类对象。因为isa决定着实例变量和类的关系,非常重要,所以子类不可以修改isa的值。另外,也不能通过直接访问isa来查询实例变量到底属于哪个类,而要通过实例方法class来完成查询。
下面对类和实例变量的相关方法进行说明。NSObject的方法与其说是为自己定义的,不如说是为其子类和所有的实例对象而定义的。
-(Class)class
返回消息接受者所属类的类对象。
+(Class)class
返回类对象。
虽然可以使用类名作为消息的接受者来调用类方法,但当类对象是其他消息的参数,或者将类对象赋值给变量的时候,需要通过这个类方法来获取类对象。
-(id) self
-(BOOL) isMemberOfClass:(Class)aClass
判断消息接受者是不是参数aClass类的对象。
-(BOOL)isKindOfClass:(Class)aClass
判断消息接受者是否是参数aClass类或者aClass类的子类的实例。这个函数和isMemberOfClass:的区别在于当消息的接受者是aClass的子类的实例时也会返回YES。
+(BOOL)isSubclassOfClass:(Class)aClass
判断消息接收者是不是参数aClass的子类或自身,如果是则返回YES。
-(Class)superclass
返回消息接收者所在类的父类的类对象。NSObject类对象的父类的类对象是null;[NSProxy superclass]也是null。
+(class)superclass
返回消息接受类的父类的类对象。
BOOL sub1 = [NSString isSubclassOfClass:[NSObject class]];
NSLog(@"%u",sub1);//1
BOOL sub2 = [NSObject isSubclassOfClass:[NSObject class]];
NSLog(@"%u",sub2);//1
NSLog(@"%@",[NSString superclass]);//NSObject
NSLog(@"%@",[NSObject superclass]);//(null)
NSLog(@"%@",[NSProxy superclass]);//(null)
8.1.3 实例对象的生成和释放
8.1.4 初始化
+(void)initialize
被用于类的初始化,也就是对类中共同使用的变量进行初始化设定定。这个方法会在类收到的第一个消息之前被自动执行,不允许手动调用。
+(id)new
new是alloc和init的组合。new方法返回的实例对象的所有者就是调用new方法的对象。但是,把alloc和init组合定义的new并没有什么优点。
根据类的实现的不同,new方法并不会每次都返回一个全新的实例对象。有时new方法会返回对象池中预先生成的对象,也有可能每次都返回同一个对象。
8.1.5 对象的比较
- (BOOL)isEqual:(id)anObject;
在NSString中如果调用isEqual:是否会调用isEqualToString:
//
// NSString+TestString.h
// Test
//
// Created by ranzhou on 16/6/7.
// Copyright © 2016年 ranzhouee. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSString (TestString)
-(BOOL)isEqualToString:(NSString *)aString;
@end
//
// NSString+TestString.m
// Test
//
// Created by ranzhou on 16/6/7.
// Copyright © 2016年 ranzhouee. All rights reserved.
//
#import "NSString+TestString.h"
@implementation NSString (TestString)
-(BOOL)isEqualToString:(NSString *)aString
{
NSLog(@"%s",__func__);
return YES;
}
@end
测试代码:
NSString *str1 = @"123456";
NSString *str2 = @"654321";
NSLog(@"%u",[str1 isEqual:str2]);
测试发现isEqual:并未调用isEqualToString:方法,在NSString中还是使用isEqualToString:比较好。
另外isEqual:方法和hash方法还有很多关联指出件第9章
8.1.6 对象的内容描述
+(NSString *)description; //使用NSLog(@“%@”,obj);的时候,就是调用obj的description来获取描述信息。
-(NSString *)description;