其他废话我就不多讲了,谈一谈我对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做个试验:
public class Father {
public Father print(){
return this;
}
}
public class Sun extends Father {
Test t = new Test();
public void printSun(){
t.print();
System.out.println(super.toString());
System.out.println(super.print());
System.out.println(this);
}
public static void main(String args[]){
Sun sun = new Sun();
sun.printSun();
}
public class Test {
public void print(){
System.out.println("i am test this : " + this);
}
}
打印结果:
i am test this : Test@c17164
Sun@1fb8ee3
Sun@1fb8ee3
Sun@1fb8ee3
我们看到,父类this和子类this是一样的,但是如果只是简单拥有一个引用,那么应该和Test的引用一样,是不一样的所以,说明父类和子类之间不是简单的拥有一个引用,我感觉是子类会把父类通过某种机制“包含”进来!
以上是本人粗浅的理解,欢迎批评指正!毕竟初学,希望和大家一起进步。
分享到:
相关推荐
本资源提供了一个基于Object-C语言实现列表选择功能的项目源码,旨在帮助开发者学习如何使用Object-C语言开发iOS应用中的列表选择功能。源码中包含了实现列表选择的关键代码和必要资源文件,开发者可以通过学习源码...
Object-C语言实现列表选择项目源码.zipObject-C语言实现列表选择项目源码.zipObject-C语言实现列表选择项目源码.zip
这篇文章为您呈现了一份详尽的Object-C语言学习资源概览,旨在帮助初学者和经验丰富的开发者系统地学习Object-C编程,并通过实践案例和项目资源提升实际编程能力。 文章首先聚焦于Object-C语言教程,这是学习Object...
Object-C语言教程 Object-C语言教程 Object-C语言教程 Object-C语言教程
Object-Oriented Programming with Object-C Object-C 进阶书籍---面向对象
Object-C语言,用C语言实现面向对象
Object-C语言教程:Objective-C 简介
总之,结合Object-C语言和"MJExtension"开源库,开发者可以轻松实现一键式的JSON转模型功能,提升iOS应用程序的开发效率和质量。如果你是一名iOS开发者,并且希望简化JSON数据处理流程,不妨尝试使用Object-C语言和...
Object-C语言教程0220.zipObject-C语言教程0220.zipObject-C语言教程0220.zipObject-C语言教程0220.zipObject-C语言教程0220.zipObject-C语言教程0220.zipObject-C语言教程0220.zip
object-c基础教程object-c基础教程object-c基础教程
Object-C_使用object-c实现的iOS运行进度视图
阅读本文档,您最好有一定的C语言、JAVA语言的基础。 文档内容: 1. GNUStep的安装 2. 类定义 3. Object-C中的布尔类型 4. Object-C中的null 5. 与C混合编写 6. 对象的初始化 7. Object-C的description方法 ...
Object-C_使用Object-C实现的堆栈stacks+队列queues
Object-C期末复习资料,包含多道题目助力期末复习,成功考试过关
EventBusObject-CVersion(EventBus的Object-C语言版本)
【Object-C】object-c入门基础 object-c入门基础 说明:object-c入门基础 object-c入门基础 (Object-c Start Basics) 文件列表: object-c入门基础.doc (27648, 2014-10-29) 【Object-C】object-c入门基础 object-c...
本博客为初学者提供了一个关于Object-C编程的全面教程。从Object-C的介绍和特点开始,逐步介绍了如何学习Object-C、Object-C的实际应用场景,以及Object-C的高级特性,如内存管理、多线程编程、设计模式和现代实践。...
一款用Object-C语言编写的视频播放器框架