Effective-Objective-C学习笔记1-熟悉Objective-C

  • Post author:
  • Post category:其他


Effective-Objective-C学习笔记1-熟悉Objective-C

最近由于实习需求,开始学习Objective-C,之前浏览过一遍Objective-C基础教程,现在在看Effective-Objective_C,这是自己的一些总结。总结只是个人的一些看法,大家想要了解更详细的内容,还请查看原著


  • 动态绑定和内存布局

  • 在类的头文件中尽量少引入其他头文件

动态绑定和内存布局

Objective-C由Smalltalk演化而来,采用消息结构(“message structure”)而不是函数调用(“function calling”),运行时所执行的代码由运行时的环境决定,而使用函数调用的语言,则由编译器决定。

采用消息结构的语言,不论是否多态,总是在运行时才查找需要执行的方法。接受消息的对象问题也需要在运行时处理,被称为“动态绑定(dynamic binding)”

Objective-C的对象都是分配在堆空间(heap space)当中,绝不会分配在栈(stack)中

两个指针指向同一个对象的内存分布情况

分配在堆中的内存必须直接管理(引用计数,后面会有介绍),而栈中用于保存变量的内存会在栈帧弹出时自动清理

需要注意的是,结构体和对象是两回事,如果只需要保存int,float等非对象类型(nonobject type),只需要使用结构体就行了。因为创建对象需要额外开销,如分配和释放堆内存等

在类的头文件中尽量少引入其他头文件

在很多情况下,可以在头文件中使用“向前声明(forward declaring)”来代替直接引入其他头文件

使用@class代替#import

然后在实现文件当中,再引用该头文件(因为如果要使用该类,必须知道其所有的接口细节)

在实现文件中引入其他类的头文件

这样能减少很多不必要的引用,提供了编译的效率

并且,向前声明解决了两个类相互引用的问题。如果A类中引用了B类,而B类中又含有A类对象,这样就会出现循环引用的问题,如果在头文件使用include,在解析其中一个头文件时,编译器会发现它引用了另一个头文件,而那个头文件回过来又引用了第一个头文件,这样就会出现死循环。虽然使用import不会导致死循环,但也会出现一个类无法正确编译的情况。而使用@class的方式则不会出现这样的问题

但在以下两种情况下,引入头文件是无法避免的

– 继承:如果你的类继承于某个父类,那你必须引入该父类的头文件

– 协议:如果要声明你的类遵守某个协议,那么该协议必须有完整定义,且不能使用向前声明,因为编译器必须知道该协议中定义的方法



版权声明:本文为github_38266145原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。