这是本系列笔记的第一篇文章,这个系列是阅读《Effective Objective-C2.0编写高质量iOS和OS X代码的52个有效方法》的读书笔记
第一条是了解Objective-C的语言起源和特点以及简单地介绍了一下对象内存分配的问题
Objective-C的动态绑定
以函数调用方式和消息传递方式做了比较,简单地说消息传递的方式,就是推迟了函数或者是对象的确定时间,采用函数调用
的方式,对象的确定是由编译器去决定的,多态还是到底要执行哪个函数实在运行的时候由“虚方法表”(virtual method table)去确定的;采用消息传递
的方式,无论是不是多态的函数,函数的确定都是在运行时确定的,接受消息的对象类型也是在运行时才确定的,程序编译的时候不会去管这些对象内存分配
先看下面的这张图
其实学过Java的话也是很容易理解的,只是这边的someString和anotherString都是NSString*
,指针类型具体的大小根据计算机的架构来决定,
NSString *someString = @"The String";
NSString *anotherString = someString;
对象被分配在堆中,而指针类型的变量都被分配到栈上,当anotherString指向了someString所指向的对象的时候,不会创建新的对象,只是对象的引用计数加一;在C++中创建在堆上的对象需要程序员手动释放内存,但是OC引入了ARC的概念,那些引用计数为0(没有强类型指针指向的)对象会自动释放内存空间
当然也有一些变量例如CGRect
,他们被分配到栈上,有一个显著的特征就是他们不是对象,不带*
其实可以发现CGRect是一个结构体,而内部的CGPoint和CGSize也是结构体,使用结构体而不使用对象可以免去一些内存的开销,通常使用结构体是因为这个“对象”里面只包含了一些简单的数据类型