1

我是一个 Objective-c 新手,我只是不明白为什么释放不属于我的对象是个坏主意。

假设我在名为的方法中有这个Europe

//initForStringTheory is a class init method;
Collider *LHC = [Collider initForStringTheory]; 

//Colliders is a NSMutableArray
[Colliders addObject: LHC]  

[LHC release]

建议我不要LHCEuropeas Europedoes not own中发布LHC,它只有一个指向它的指针。因此我应该充分利用自动释放池并做

//newCollider is a pointer for the newly created instance in initForStringTheory
return [newCollider autorelease]; 

initForStringTheory. 但为什么?

指针不是也指向Europe实例吗?为什么我不能只释放LHC而不是在 init 方法Europe中返回自动释放?newCollider

4

2 回答 2

1

Stavash 基本上涵盖了是否释放它取决于方法是否返回保留实例。

但是,您不应该真的需要知道一个方法的作用是为了正确使用内存管理。Cocoa MRC 内存管理遵循基于方法名称的方法的规则。根据规则,名称以alloc, retain, new,开头的方法copy,或者mutableCopy返回一个保留的实例,调用者负责释放它。所有其他名称的方法都返回一个非保留实例,调用者不应释放它。

因此,假设(当然,这是一个很大的假设)initForStringTheory正确遵循规则,它不应该返回保留实例(这并不意味着它一定是autoreleased;它可能被其他东西保留并直接返回给您)。

问题的另一部分是拥有一个名为init.... 通常,以构造函数开头的实例方法是在创建实例init的结果上立即运行的。alloc那么一个名为的类方法到底是做什么的init...呢?此外,按照惯例,init方法有一个特殊规则,即它“消耗”由返回的保留实例alloc,并返回一个(不一定相同)保留实例。但这将如何适用于这种情况,它是在一个类上调用的?它会“消耗”类对象的保留计数(什么都不做),然后返回一个保留的实例吗?没人知道。

所以总而言之,这段代码确实需要重写。绝对没有命名的类方法init...。并确保您编写的所有方法都具有正确遵循规则的内存管理行为,基于它们的名称。

于 2013-01-04T20:08:23.583 回答
0

这完全是一个返回什么的问题initForStringTheory- 如果这是一个方便的初始化方法,例如[NSArray arrayWithObjects...]or [NSString stringWithFormat...],它会创建一个自动释放的实例,您不需要在将它添加到您的集合后释放它。但是,如果这是一个返回初始化的非自动释放实例的初始化,则您有责任在将本地实例定义添加到集合后立即在您的方法中释放它。

对象的保留计数在添加时增加 1,因此您不希望它为 2,因为您在实例化后没有释放/自动释放它(会导致内存泄漏,因为对象永远不会被释放,即使它不在数组中)。

阅读:http: //developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html

于 2013-01-04T10:35:20.613 回答