ObjectiveC学习笔记

1、#import是GCC编译器提供的,Xcode在编译Objective-C、C和C++程序时都会使用它,#import可保证头文件只被包含一次,而不论此命令实际上在那个文件中出现了多少次。

  在C语言中,程序员通常使用基于#ifdef命令的方案来避免一个文件包含另一个文件,而后者又包含第一个文件的情况。而在Objective-C中,程序员使用#import实现这个功能。

2、NSLog()与printf()相比添加了一些特性,例如时间戳、日期戳和自动附加换行符(‘\n’)等。

3、Objective-C中的BOOL实际上是一种对带符号的字符类型(signed char)的定义(typedef),它使用8位存储空间。YES定义为1,而NO定义为0(使用#define)。

   Objecitve-C并不将BOOL作为仅能保存YES或NO值得真正的布尔类型来处理。编译器将BOOL认作8位二进制数,YES和NO值只是一种约定。

4、过程式程序建立在函数之上,数据为函数服务。面向对象编程从相反的角度来看待问题,它以程序的数据位中心,函数为数据服务。在OOP中,数据通过间接方式包含对自身操作的引用代码。

5、Objective-C不支持多继承。但是可以通过分类和协议来获取多继承的优点。

6、继承在子类和超类之间建立了一种“is a”(是一个)的关系;复合建立的则是“has a”(有一个)的关系。

7、在跨文件依赖关系中,头文件或源文件需要使用另一个头文件中的信息。文件之间相互重复的导入会增加编译次数,也会导致不必要的重复编译。而巧妙地使用@class指令能够减少编译时间,@class告诉编译器“相信我,你最终能够了解这个名称的类”,它可以减少不得不导入的头文件数量。

8、@synthesize是一种新的编译器功能,表示“创建该属性的访问器”。当遇到代码@synthesize rainHandling时,编译器将输出-setRainHandling:和-rainHandling方法的已编译的代码。

9、类别有两方面的局限性。第一,无法向类中添加新的实例变量。类别没有位置容纳实例变量。第二,名称冲突,即类别中的方法与现有的方法重名。当发生名称冲突时,类别具有更高的优先级。

10、Cocoa中的类别主要用于3个目的:将类的实现分散到多个不同文件或多个不同框架中,创建对私有方法的前向引用,以及向对象添加非正式协议。

11、KVC介绍:键/值编码中的基本调用包括-valueForKey:和-setValue:forKey:。以字符串的形式向对象发送消息,这个字符串是我们关注的属性的关键。KVC需要解析字符串来计算答案,因此速度比较慢。

原文地址:https://www.cnblogs.com/wenxp2006/p/2599872.html