怪,但事实我们所讨论的依然还是 C 语言。因为 Objective-C 确实是 C,说 的简单些: Objective-C 就是拥有一个面向对象层(Object Oriented Layer)的 C。而 Objective-C 正是通过从 Smalltalk 进化而来的这种语法,实现了对这个面向对 象层的支持。因此如果您正在使用 Objective-C 开发一个 Cocoa 应用程序,同 时又希望在某些代码的某些位置插入一些 C 代码,那就请放心大胆的继续吧! 设计模式深入骨髓:
设计模式深入骨髓:无处不在的 MVC 在传统的开发模式中,我们很容易陷入“胶水代码”的陷阱里。所谓的“胶水代 码”, 顾名思义, 就是仅仅用来保持用户界面数据、 状态同步的函数调用的集 合 体。这些函数调用扯不断,理还乱,并且使代码变的非常冗长、易出错、不易维 护。
为了解决这个问题,Cocoa 提供了多个内部机制:Key-Value Coding(KVC)、 Key-Value Observing(KVO)、Key-Value Binding(KVB)。这些机制通过规定 了一组通用的 Cocoa 命名法则、调用规则等,实现了如下功能: 1. 使用一对高度规范化的访问方法, 获取以及设置任何对象的任何属性的值 (所 谓的属性既可以是个实实在在的成员变量, 也可以是通过一对成员方法所抽象出 的该对 象的一个性质)。 2. 通过继承一个特定的方法, 并且指定希望监视的对象及希望监视的属性名称, 就能在该对象的指定属性的值发生改变时,得到一个“通知”(尽管这不是一个 真正意 义上的通知),并且得到相关属性的值的变化(原先的值和改变后的新 值)。 3. 通过一个简单的函数调用,使一个视图对象的一个指定属性随时随地都和一 个控制器对象或模型对象的
一个指定属性保持同步。 一个开发者可以利用这些功能,将自己创建的类写的很范化、很通用,然后通过 K
VB 将多个视图“绑定”到一个或多个控制器上,再将控制器绑定到最底层 的 数据模型上。这样一来,任何一个视图上的改变都会通过 KVC 被“压”到控制器 里, 然后又通过 KVC 从控制器“压”到数据模型里。 当数据模型中的值发生改 变 时,一个或多个控制器又会得到 KVO 的“通知”,接着只要被绑定了的视图又会 得到这一个或多个控制器的 KVO“通知”。 这样以来, 开发者只需要在适当的 时 候告诉 Cocoa,什么对象的什么值该和什么对象的什么值绑定,就可以了,其余 数据更新、格式化等
工作 Cocoa 都会替你完成。 是不是很方便呢? 之一: Easy Life 之一:内存管理 内存管理是令很多开发人员头大的
问题,在 Cocoa 中,内存管理是通过引用计数 器模型完成的。 Cocoa 中的每个对象都拥有一个引用计数器,用来维持自己的生命周期。每当一 个对象需要“使用”或“占有”另一个对象的时候,它通过向该对象发送 一个 retain 消息来对该对象的引用计数器进行自增,而当它不再需要(或使用完) 该对象的时候,它通过向该对象发送一个 release 消息来对该对象的 引用计数 器进行自减。当一个对象的引用计数器自减到零时,该对象就会被释放。 下面我们来看一个例子,例如: NSString *aString = [[NSString alloc] initWithString:@"This is a demo."]; 这段代码会创建一个 NSString 对象,并对其进行初始化。当一个对象被创建的 时候,它的引用计数器会被设为 1。因此当您不再需要该对象,只要直 接对其
发送 release 消息,它就会被直接析构。当您有别的代码块也需要使用这个 NSString 时,您可以对这个 NSString 对象调用一次 retain 来增加它的引用计 数器: [aString retain]; 这个时候,它的引用计数器值就是 2 了。当您使用完该对象 时,如果您对该对象调用过 retain,那就应该“对称”地调用一次 release。这 时一种基本 地编程规范,我将它称为“谁 retain,谁 release”。 [aString release]; 调用完以后, 引用计数器再次回到 1。 最后, 当我们