码迷,mamicode.com
首页 > 其他好文 > 详细

关于self与self class用法上的区别

时间:2015-07-08 12:34:55      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:

在许多地方可以见到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。

关于self与self class用法上的区别

标签:

原文地址:http://www.cnblogs.com/HypeCheng/p/4629680.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!