NSObject
1、加载及初始化类
/** 运行时加载类或分类调用该方法, 每个类只会调用一次 */
+ (void)load {
}
/** 类实例化使用前需要先初始化, 一个类调用一次, 如果子类没有实现该方法则会调用父类方法 */
+ (void)initialize {
}
load
和initialize
区别在于:load
是只要类所在文件被引用就会被调用,而initialize
是在类或者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目,就不会有load
调用;但即使类文件被引用进来,但是没有使用,那么initialize
也不会被调用;load
每个类只会调用一次,initialize
也只调用一次,但是如果子类没有实现initialize
方法则会调用父类的方法,因此作为父类的initialize
方法可能会调用多次。
2、分配内存空间及初始化对象
+(id)alloc;
-(id)init;
3、释放对象
-(void)dealloc;
此方法除了在子类中重写的情况外,不允许直接调用。
4、给对象发送消息(执行方法)
1、使用performSelector系列方法
使用performSelector:
是运行时系统负责去找方法,在编译时候不做任何校验;因此在使用时必须先使用respondsToSelector:
检查对象是否能调用方法,否则可能出现运行崩溃。performSelector:
常用于调用运行时添加的方法,即编译时不存在,但是运行时候存在的方法。另外需要注意的是performSelector:
系统提供最多接受两个参数的方法,而且参数和返回都是id
类型,并不支持基础数据类型(如:int, float等)。
2、使用IMP指针调用
SEL
是方法的索引。IMP是函数指针,指向方法的地址。SEL
与IMP
是一一对应的关系,因此我们可以通过修改对应关系达到运行时方法交换的目的。
创建SEL
对象两种方法:
1、使用@selector()
创建
2、使用NSSelectorFromString()
创建
获取方法IMP
指针两种方法:
1、- (IMP)methodForSelector:(SEL)aSelector;
实例方法
2、+ (IMP)instanceMethodForSelector:(SEL)aSelector;
类方法
5、复制对象
定义了NSCopying和NSMutableCopying协议
copy
拷贝为不可变对象,mutableCopy
拷贝为可变变量,copy
和mutableCopy
都可理解为复制了一个新对象。虽然copy
对静态对象只是引用计数加1,但是并不影响我们对复制前后的对象进行使用。需要注意的是对于容器对象而言,这两个方法只是复制了容器本身,对容器中包含的对象只是简单的指针引用,并没有深层复制。
5、KVC和KVO
定义了 NSKeyValueCoding和NSKeyValueObserving协议。
6、归档
定义了NSCoding协议。
7、提供了判断方法
isEqual
hash
isKindOfClass
isSubclassOfClass
isMemberOfClass
respondsToSelector
8、获取Class
-(Class)class;
+(Class)class;