首页 » iOS编程基础:Swift、Xcode和Cocoa入门指南 » iOS编程基础:Swift、Xcode和Cocoa入门指南全文在线阅读

《iOS编程基础:Swift、Xcode和Cocoa入门指南》12.4 Cocoa对象管理内存的方式

关灯直达底部

如果需要,那么内建的Cocoa对象会通过保持来获得你传递给它们的对象的所有权,当然,接下来会通过释放来平衡之前的保持。实际上,这是非常普遍的情况;如果Cocoa对象没有保持你传递给它的对象,那么文档中会有相应的说明。

集合(如NSArray或NSDictionary)就是个显而易见的示例(参见第10章关于常见集合类的介绍)。如果一个对象可以在任意时刻销毁,那么它几乎无法成为集合的元素;因此,在向集合中添加元素时,集合会通过保持来声明对该对象的所有权。接下来,集合就成为一个功能良好的所有者。如果是可变集合,并且其中的元素被删除了,那么集合就会释放该元素。如果集合对象销毁了,那么它会释放其中的所有元素。

在ARC之前,从可变集合中删除对象存在一个潜在的陷阱。考虑如下Objective-C代码:


id obj = myMutableArray[0];[myMutableArray removeObjectAtIndex: 0]; // bad idea in non-ARC code!// ... could crash here by referring to obj ...,  

如前所述,在从可变集合中删除对象时,集合会释放它。因此,上述示例中被注释的一行涉及对myMutableArray中元素0对象的隐式释放。如果将对象的保持计数减为0,那么它就会被销毁。指针obj就会变成一个野指针,在将其当作实际对象使用时会导致应用崩溃。

不过在ARC中,这种危险情况已经不复存在。将一个引用类型的对象赋给一个变量时会保持它!这样,代码就变得安全了,下面是与之等价的Swift代码:


let obj = myMutableArray[0]myMutableArray.removeObjectAtIndex(0)// ... safe to refer to obj ...  

第1行会保持对象,第2行会释放对象,不过这个释放会平衡掉之前将对象放到集合中时对该对象的保持。这样,对象的保持计数依旧大于0,它会在代码执行期间继续存活。