在许多地方可以见到self和[self class]的调用方式,那么他们有区别吗?
1 首先self是什么,它是指向实例变量首地址的指针(同c++的this一样)可以访问对象的资源。
2 [self class] 首先看下class 它返回的是元类的指针,所以通过[self class]可以访问当前类的静态函数
为什么[self class] 可以访问到类指针呢,可以看下NSObject的结构:
@interface NSObject <NSObject> {
Class isa OBJC_ISA_AVAILABILITY;
}
//任何类都是继承于NSObject所以在内存中isa是首地址 ,self指向的就是isa的的地址。
看下在runtime里面class是怎么调用的,首先是获取NSObject 类的isa变量,通过isa来返回元类的指针,所以也就是说class是返回了当前类的类指针。
- (Class)class {
return object_getClass(self);
}
Class object_getClass(id obj)
{
if (obj) return obj->getIsa();
else return Nil;
}
3 那么[self class]除了可以访问静态函数,变量还有其他用处吗?看下面这个例子
@interface Engine:NSObject<NSCopying>
@end
@implementation Engine
-(id)copyWithZone:(NSZone *)zone{
return [[[self class]allocWithZone:zone]init];
}
我们需要将消息发送给一个类,而不是一个实例变量。那么应该发送给哪个类呢?直觉告诉我们应该是Engine,像这样:[Engine allocWithZone:zone];
但是这行代码只适用于Engine类,不适合它的之类。如果给它的子类Slant6发送copy消息,最后使用的是Engine类的拷贝而不是slant6类的拷贝,创建出来的时Engine对象。
所以要使用[self class]他可以将消息发送给正在接受copy消息的对象所属的类。如果self是一个Slvant6的对象,就会发送给Slvant6。