您的位置:首页 > 移动开发 > Objective-C

C++转向Objective-C需要注意的地方(基础)。

2013-04-02 14:59 134 查看
部分摘自《Objective-C基础教程》高朝勤 杨越 刘霞译,本人添加一些代码和图片,更容易理解。

参考《深度探索C++对象模型》

从C++转向Objective-C

Objective-C中没有多重继承、命名空间、运算符重载、模板、类变量、抽象类、STL等结构。但是Objective-C提供了相似的结构。

Objective-C没有C++中的构造函数、拷贝构造和析构函数是最明智的!当然,这样的代价就是不能有栈对象。

C++虚表与Objective-C动态分配

C++与Objective-C的最大区别在于分配方法(函数)的机制不同。C++基于虚表(vtable)机制确定虚函数调用什么代码。

可以认为每个C++对象都有一个vptr指针,指向函数指针数组。

编译器知道代码需要调用某个虚函数后,它将从虚表的开头计算便宜位置,并发送机器代码使函数指针指向该偏移位置,然后执行该位置的代码段程序。该过程需要编译器在编译时知道调用成员函数的对象类型(这就是为什么写C++代码时,需要强制转换一些类型),这样才能正确计算虚表的偏移位置。这种分配非常快,只需要几个指针操作和一个获取函数指针的读操作。



Objective-C使用运行时函数进入各种类型结构中查找相应的代码以供调用。

这种技术比C++的路由要慢的多。Objective-C牺牲了一定的速度和安全,换来灵活性和便捷性。在C++中,因为编译器可以确保对象能处理对应的方法,所以C++是非常安全的。但是缺乏灵活性。

这里说一下isa指针,NSObject中有一个Class isa的指针类型的成员变量,因为我们的对象大都直接或者间接的从NSObject继承而来,因此都会继承这个isa成员变量,isa在运行时会指向对象的Class对象,一个类的所有对象的Class对象都是同一个(J***A
也是如此),这保证了在内存中每一个类型都有唯一的类型描述。这个Class对象中也有个isa指针,它指向了上一级的父类的Class对象。
在明白了这个isa之后,你就可以明白在继承的时候,A继承B,你调用A的方法a(),首先A的isa到A的Class对象中去查找a()方法,找到了就调用,如果没找到,就驱使A的Class对象中的isa到父类B的Class对象中去查找。
C++编译器不再保留很多类信息,例如类的继承链、类的成员等。通常,C++在运行时处理对象的能力是有限的,最多只能进行动态强制类型转换。通过该操作,可以了解某个对象是否是另一个对象的指定子类。

C++在运行时不能改变继承层次结构。编译并链接程序后,程序几乎就固定了。在Objective-C中,对象只需要方法就可以实现自身的可调用性。这样,任何对象都可以成为其他对象的数据源和委托。缺少多重继承可能会给我们带来诸多不便,但是,我们向任何对象发送任何消息时不必再考虑它的继承血统,这在很大程度上简化了我们的工作。

显然,与C++相比,向任何对象发送任何消息降低了而且因为编译器可以确保对象能处理对应的方法,所以C++是非常安全的。的类型安全性。如果接受消息的对象不能处理该消息,你将会得到运行时的错误。Cocoa中没有类型安全容器,任何对象都可以放入某个容器中。

Objective-C携带了许多关于类的元数据,因此,可以通过反射判断某个对象是否相应某个消息。含有数据源或委托的对象经常采用这种方法。但是首先要检查委托是否相应某个消息,这样可以避免可能出现的运行时错误。因此,可以通过类别向其他类中添加方法。

通过元数据,可以轻松操作程序中用到的类。可以确定实例变量,实例变量在对象中的布局,以及类定义方法。甚至删除可执行对象的调试信息也不删除Objective-C的元数据。

Objective-C中,可以直接想向nil对象发送消息,而不必检查发送的消息是否为NULL。

所有的Objective-C的对象都是动态分配地址的。

不存在基于栈的对象,不存在临时对象的自动创建和销毁,也不存在临时对象的自动创建和销毁,也不存在类型间的自动类型转换。因此,Objective-C对象比基于栈的C++对象更复杂。这样使用对象地址作为环境指针是安全的,不必担心某些栈分配的对象会消失。(比如C++中返回局部自动变量的指针,导致再次使用指针是程序崩溃)。

元数据

任何文件系统中的数据分为数据和元数据。数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息(inode...)等等。在集群文件系统中,分布信息包括文件在磁盘上的位置以及磁盘在集群中的位置。用户需要操作一个文件必须首先得到它的元数据,才能定位到文件的位置并且得到文件的内容或相关属性。

这个好像是数据库中的元数据,Objective-C的元数据,还没有找到具体的解释。
文件的元数据,被看做是“文件的一些属性,比如:大小,时间等”

OC的析构函数dealloc

子类的dealloc不会调用父类的dealloc,而C++则是派生类的析构函数调用父类的析构函数!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: