关于Object-C 底层实现self isa 的理解

其他废话我就不多讲了,谈一谈我对self 和 isa的理解!主要是和java对比: 

self概念上的理解上我认为和java中的this是一样的,当然,底层的实现是有区别的,毕竟是不同平台的两个语言,但是他们的概念的理解是一样的。就是在类实例化对象时,self指向了对象的首地址。 

isa则相当于java中每个对象的class,就像我们平时写的,XXX.getClass()或XXX.class。OC中的isa指向了其类对象,想一下,我们在java中使用反射时不都是需要取得其类对象嘛!OC也一样,类对象isa也是用在运行时获取对象的类信息的。这样说其实和java中的class概念是一致的。大家可以参考这篇文章:http://blog.sina.com.cn/s/blog_7a2ffd5c01010nme.html 
《Object-C基础教程》中有提到:“self指向的对象的首地址,而对象的首地址是isa变量”这样说不容易理解,会让人误会self 和 isa指向了同一个东西,应该是这样:self指向了对象的首地址,而对象的首地址一般是isa变量,isa又是保存了对象的类对象的首地址!汗,好像还是很绕,反正就是这两个变量其实是各有各的用处就是了。 
-------------------------------------分割线------------------------------------------- 
从这里顺便提一下子类的self和父类的self 
我们初始化一个对象时会看到:self=[super init],先将父类初始化,然后再把父类的self赋给子类的self,这里又有点绕了,其实,父类的self和子类的self是同一个(正常情况下);那为什么要赋给子类的self呢?这就是因为有“非正常”的情况存在,大家可自行查阅,文章非常多。这里主要解释一下为什么父类的self和子类的self是同一个,我们平时看到很多文章会这么说:子类拥有一个父类的引用(无论是java还是OC都会这么说),我觉得这样说是不准确的说法,如果为了容易理解可以这么说。因为,如果只是简单的子类拥有父类的引用的话,父类的self和子类的self应该是不同的。和java一样,父类的this和子类的this也是同样的道理,我们用java做个试验: 
Java代码   收藏代码
  1. public class Father {  
  2.   
  3.     public Father print(){  
  4.         return this;  
  5.     }  
  6. }  
  7.   
  8. public class Sun extends Father {  
  9.     Test t = new Test();  
  10.     public void printSun(){  
  11.         t.print();  
  12.           
  13.         System.out.println(super.toString());  
  14.         System.out.println(super.print());  
  15.         System.out.println(this);  
  16.     }  
  17.       
  18.     public static void main(String args[]){  
  19.         Sun sun = new Sun();  
  20.           
  21.         sun.printSun();  
  22.     }  
  23.   
  24.   
  25. public class Test {  
  26.   
  27.     public void print(){  
  28.         System.out.println("i am test this : " + this);  
  29.     }  
  30. }  

打印结果: 
i am test this : Test@c17164 
Sun@1fb8ee3 
Sun@1fb8ee3 
Sun@1fb8ee3 

我们看到,父类this和子类this是一样的,但是如果只是简单拥有一个引用,那么应该和Test的引用一样,是不一样的所以,说明父类和子类之间不是简单的拥有一个引用,我感觉是子类会把父类通过某种机制“包含”进来! 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值