写在前面
这本书对于iOS开发者来说,并不是一本入门书籍,尽管这本书很薄,但是书中罗列的52条编程技巧,如果没有iOS的开发基础的话,阅读起来也并不容易。它是很适合iOS开发从初级迈向中高级的一本书,讲解了一些我平时在做iOS开发时,容易忽略的一些细节 我目前也是在iOS开发的初级阶段,因此对书笔记中会加入很多外部链接和一些我自己的理解,帮助更好的学习OC
第一条:了解Objective-C的起源
- Objective-C语言由Smalltalk演化而来,Smalltalk是消息型语言的鼻祖
- 关于消息型语言和函数调用语言的区别:
消息型语言:其运行时所应执行的代码由运行环境来决定,消息结构语言在运行时才会去查找所要执行的方法(对运行时的解释:编译器甚至不关心消息的对象是何种类型,接受消息的对象问题也要在运行时处理——即动态绑定) 函数调用语言:其运行时所应执行的代码由编译器决定,函数调用语言要按照虚方法表来查出到底应该执行哪个函数实现(虚方法表是编程语言为了实现动态派发/运行时方法绑定的一种机制) - Objective-C的重要工作都由“运行期组件(runtime component)”而非编译器完成
- 运行期组件(runtime component):其本质上是一种与开发者编写的代码相链接的动态库,能够将开发者编写的代码粘合起来
从网上摘录的一段话,帮助更好的理解Runtime: Objective-C 扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制。而这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库。它是 Objective-C 面向对象和动态机制的基石。 像 Objective-C 这种高级编程语言想要成为可执行文件需要先编译为汇编语言再汇编为机器语言,机器语言也是计算机能够识别的唯一语言,但是 Objective-C 并不能直接编译为汇编语言,而是要先转写为纯 C 语言再进行编译和汇编的操作,从 OC 到 C 语言的过渡就是由 runtime 来实现的。然而我们使用 OC 进行面向对象开发,而 C 语言更多的是面向过程开发,这就需要将面向对象的类转变为面向过程的结构体
- Objective-C是C语言的超集,因此C语言中所有的功能在编写OC代码时依然适用
- 理解C语言的内存模型,有助于理解OC的内存模型和引用计数机制的工作原理
- OC语言中使用指针指向对象,
NSString* someString = @"The string"; ,所有OC语言中的对象都必须这样声明,因为对象所占的内存总是分配在堆空间中,不会分配在栈上,因此需要使用指针。分配在堆中的内存需要直接管理(手动管理),而分配在栈上的内存会在其栈帧弹出时自动清理(自动管理) - OC指针在内存中的示例:
NSString* someString = @"The string";
NSString* anotherString = someString;
解释:有两个指针变量指向此实例,两个变量都是NSString*类型,这说明当前栈帧里分配了两块内存,每块内存的大小都能容下一枚指针(在32位架构的计算机占4字节,在64位架构的计算机占8字节)
内存模型的图待补充
- OC和C:在OC代码中,有时会遇到定义里不含*的变量,它们可能会使用栈空间,这些变量所保存的不是OC对象,例如
CGRect 就是C的结构体;如果改用OC对象的话,会消耗更多的性能,占用更多的内存
|