彻底不需要这个对象的时候, 我们可以这么做: [aString release]; aString = nil; 上两行代码中,第一句会负责将这个 NSString 对象析构,第二句会负责将原来 指向这个 NSString 对象的指针(NSString *aString)“归零”,因为“野 指针”随时可能造成您程序的异常及崩溃。 听着是不是挺简单? 当然也有稍微复杂一些的情况,话说一开始我们有提到一个叫作 NSAutoreleasePool 的类吧?NSAutoreleasePool 是 Cocoa 内存管理机制里很重 要的一个环节。我们在
本着“谁 retain,谁 release”的对象使用的大前提下, 经常会碰到这么一个问题,那就是我们 希望返回一个在局部中创建的对象: (NSString)demoString { NSString *result = [[NSString alloc] initWithString:@"This is a demo."]; return result; } 在“谁 retain, release”的原则下, 谁 上面的代码显然只负责了 retain (alloc 调用等效于 retain),但是没有负责 release,因此这么写可能会造成内存泄 露,因为调用这个方法(或这个 API)的代码段并不知道究竟是否需要负责释放 这个方法(或这个 API)的返回 值。 但是如果我们将它直接 release 了: (NSString)demoString { NSString *result = [[NSString alloc] initWithString:@"This
is a demo."]; [result release]; return result; } 那 return 的将会是个“野指针”(或者如果你干的足够干净,return 的是个零 指针),不是我们需要的值。因此我们需要一个能够延迟释放,并 且能够自动 释放的机制。于是,人们发明了名叫 NSAutoreleasePool 的又一个轮子,而代码 则变成了这个样子: (NSString)demoString { NSString *result = [[NSString alloc] initWithString:@"This is a demo."]; [result autorelease]; return result; } 在对一个对象发送了 autorelease 之后,这个对象不会被立即释放,而是被“登 记”到了离它最近的一个 NSAutoreleasePool 对象上。当该 NSAutoreleasePool 被清空或释放的时候,这个“登记”了的对象才会被真正发送一个 release 消 息。 之二: Easy Life 之二:容器 容器是让多数程序员又爱又恨的东西。在 Cocoa 中,容器是如此的简单易用以至 于您一旦用过,就会对它们“爱不释手”。Cocoa 中的容器类主要有 这么几个: NSString、 NSArray、 NSDictionary、 NSSet 和 NSIndexSet 等, 它们都是 Foundation Framework 的一部分。 为什么人们会对 Cocoa 的容器“爱不释手”呢? 的容器“爱不释手” 原因一:NSArray、NSDictionary、 都不强制其内部元素类型的一致性。 原因一:NSArray、NSDictionary、NSSet 都不强制其内部元素类型的一致性。 举个简单的例 子: NSString *aString = [NSString stringWithString:@"This is a demo."]; NSNumber *aNumber = [NSNumber numberWithInteger:0]; NSArray *anArray = [[NSArray alloc] initWithObjects:aString, aNumber, nil];
在上述例子中, 我们首先建立了一个 NSString 对象, 然后又建立了一个 NSNumber 对象, 最后我们将这两个 NSString 和 NSNumber 对象都“塞”到了一个 NSArray 对象中。 有够爽吧?连想都别想,什么东西都能往里面装(基本类型、结构体除外)! 原因二:容器类的“可修改” 原因二:容器类的“可修改”和“不可修改” 不可修改” 上面我们展示的 NSString、NSArray、NSDictionary、NSSet 以及 NSIndexSet 等,都是容器的“不可修改”的版 本。所谓
的“不可修改”,指的是这个容器 一旦被创建以后, 我们就不可以通过代码修改它的集合。 那如果我们需要修改 (例 如添加、删除、替换)这些容器的元 素,该怎么办呢? Cocoa 中几乎所有的容器类,都提供了另外一个“可修改”的版本。例如:继承 自 NSString 的 NSMutableString、继承自 NSArray 的 NSMutableArray、继承自 NSDictionary 的 NSMutableDi