gpt4 book ai didi

ios - 为什么我应该在这种情况下使用自动释放?

转载 作者:行者123 更新时间:2023-11-29 13:22:02 24 4
gpt4 key购买 nike

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

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

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

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

[LHC release]

我被建议不要在 Europe 发布 LHC,因为 Europe 不拥有 LHC,它只是有一个指向它的指针。因此我应该好好利用自动释放池并做

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

initForStringTheory 中。但是为什么?

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

最佳答案

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

但是,为了正确使用内存管理,您真的不需要知道方法的作用。 Cocoa MRC 内存管理遵循基于方法名称 方法做什么的规则。按照规则,名称以allocretainnewcopy开头的方法mutableCopy 返回一个保留的实例,调用者负责释放它。具有所有其他名称的方法返回一个非保留实例,调用者不应释放它。

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

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

所以综上所述,这段代码确实需要重写。绝对没有名为 init... 的类方法。并确保您编写的所有方法都具有根据名称正确遵循规则的内存管理行为。

关于ios - 为什么我应该在这种情况下使用自动释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14155379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com