和 C 一样,Objective-C 也使用头文件来包含结构体、符号常量和函数原型等元素的声明。C 中使用是 Xcode 编译器提供的,可保证头文件只被包含一次,无论此命令在该文件总出现了多少次。 在 C 中,通常使用基于#ifdef命令的方案来避免一个文件包含另一个文件而后者又包含前者的情况。 布尔类型指的是可以存储真值和假值的变量类型。C 的布尔数据类型bool具有true和faluse两个值,Objective-C 的BOOL具有YES和NO两个值。 Objective-C 中的 BOOL 实际上一种对带符号的字符类型(signed char)的类型定义(typedef),它使用 8 位的存储空间。通过#define把YES定义为 1,NO定义为 0,。Objective-C 并不会将BOOL作为仅能保存YES或NO值的真正布尔类型来处理。编译器仍将BOOL认作 8 位二进制数。这样会引发一个小问题:如果不小心将一个大于 1 字节的整数值赋给了一个BOOL变量,那么只有低位字节会用作BOOL值。 面向对象编程(Object-Oriented Programming)的首字母缩写为 OOP,这是以一种编程技术,是为了编写模拟程序而开发的。OOP 是一种编程架构,可构建由多个对象组成的软件。 OOP 的一个关键概念 - 间接:在代码中通过指针间接获取某个值,而不是直接获取。间接是 OOP 的核心,OOP 使用间接来调用某个函数,而不是直接调用。 OOP 中的继承表明一个类从另一个类,它的父类或超类(superclass)中获取某个特性,是在两个类中建立关系的一种方式。 某些编程语言(例如 C++)具有多继承性,也就是一个类可以直接从两个或者多个类继承而来,但是 Objective-C 不支持多继承。 当代码发送消息时,Objective-C 的方法调度机制将在当前的类中搜索相应的方法,如果无法在接收消息的对象的类文件中找到相应的方法,它就会在该对象的父类中进行查找。 self = [super init],[super init]为了让父类将所有的初始化工作一次性完成,init返回的值就是被初始化的对象,这么做是为了防止父类在初始化过程中返回的对象和一开始创建的不一致。 Objective-C 中复合是通过包含作为实例变量的对象指针来实现的。 方法实现),(接收消息并执行操作),(通过复合以及向方法传递参数),(被释放掉)。 引用技术(reference counting)& 保留计数(retain counting):每个对象都有一个和之相关联的整数,被称作它的引用计数器或保留计数器。当使用 创建一个对象时,对象的保留计数器值被设置为 1。增加对象的保留计数器的值,可以发送一条 自动释放池(autorelease pool):用来存放对象的池子(集合),并且能够自动释放。当给一个对象发送 消息时,实际上是将该对象添加到了自动释放池中。当自动释放池被销毁时,会向该池中的所有对象发送 可以使用NSMutableArray编写自己的自动释放池,以容纳对象并在dealloc方法中向池中的所有对象发送release消息。 自动释放池被清理的时间是完全确定的:要么是在代码中你手动销毁,要么是使用AppKit时在事件循环(runloop)结束时销毁。你不必担心程序会随机地销毁自动释放池,也不必保留使用的每一个对象,因为在调用函数的过程中自动释放池不会被销毁。 当你使用new、alloc或copy方法创建一个对象时,该对象的自动引用计数器的值为 1,当不再使用该对象,应该像该对象发送一条release或autorelease消息。 当你通过其他方法获得一个对象时,假设该对象的自动计数器的值为1,而且已经被设置为自动释放,那么你就不需要执行任何操作来确保该对象得到清理。如果打算拥有该对象,就需要保留它并确保在操作完成时释放它。 如果保留了某个对象,就需要释放或自动释放该对象。必须保持retain方法和release方法使用次数相等。 |