【问题标题】:If we use MRC in objective c what is the retain count of sushiName and sushiString . And what about _sushiTypes?如果我们在目标 c 中使用 MRC,那么 sushiName 和 sushiString 的保留计数是多少。 _sushiTypes 呢?
【发布时间】:2017-12-14 15:52:04
【问题描述】:
NSString * sushiName = [_sushiTypes objectAtIndex:indexPath.row]; 
NSString * sushiString = [NSString stringWithFormat:@"%d: %@", 
    indexPath.row, sushiName]; 

如果我们在目标 c 中使用 MRC,sushiNamesushiString 的保留计数是多少? 那么_sushiTypes呢?

【问题讨论】:

    标签: objective-c memory-management reference-counting


    【解决方案1】:

    回答您的问题:

    • objectAtIndex 的调用不会将所有权转移给您的代码(因此,实际上保留计数没有改变)。如果您想确保对象在从数组中移除时不会被解除分配(或者如果数组本身被解除分配),您需要使用retain 声明所有权。

    • sushiString 引用了 stringWithFormat 返回的自动释放对象,该对象尚未将所有权转移给您的代码。因此,如果您不希望在自动释放池耗尽时释放它,那么您必须自己 retain 它。

    • Re _sushiTypes,我们不能说,因为您没有分享您是如何实例化它的和/或您可能正在做的任何事情以声明对该数组的所有权。


    更多信息请见Advanced Memory Management: Basic Memory Management Rules

    内存管理模型基于对象所有权。任何对象都可能有一个或多个所有者。只要一个对象至少有一个所有者,它就会继续存在。如果一个对象没有所有者,运行时系统会自动销毁它。为确保清楚您何时拥有某个对象,何时不拥有,Cocoa 设置了以下策略:

    • 您拥有自己创建的任何对象

      您使用名称以“alloc”、“new”、“copy”或“mutableCopy”开头的方法创建对象(例如,allocnewObject、或mutableCopy)。

    • 您可以使用retain获取对象的所有权

      通常保证接收到的对象在接收它的方法中保持有效,并且该方法也可以安全地将对象返回给它的调用者。您在两种情况下使用retain: (1) 在访问器方法或init 方法的实现中,获取要存储为属性值的对象的所有权; (2) 防止对象因某些其他操作的副作用而失效(如Avoid Causing Deallocation of Objects You’re Using 中所述)。

    • 当您不再需要它时,您必须放弃您拥有的对象的所有权

      您通过向对象发送release 消息或autorelease 消息来放弃对象的所有权。因此,在 Cocoa 术语中,放弃对象的所有权通常称为“释放”对象。

    • 您不得放弃不属于您的对象的所有权

      这只是之前明确规定的政策规则的推论。

    一些最后的观察:

    1. 如果您担心在 Objective-C MRC 世界中的内存管理,静态分析器(按 shift+command+B 或从“产品”菜单中选择“分析”)非常擅长识别问题。在执行任何其他操作之前,请确保您从静态分析器获得了干净的运行状况。

    2. NSString 具有各种内部性能增强功能,这些增强功能可能使字符串看起来比您对基本内存管理规则(上图)所期望的寿命更长。小心不要从使用NSString 对象的任何经验测试中得出更广泛的结论。它们的行为与其他对象不同。

    3. 我建议您不要考虑保留计数,而是考虑上面引用中提到的“所有权”。请参阅Advanced Memory Management Guide 了解更多信息。

    【讨论】:

    • 感谢@Rob 提供了这么好的答案。我还有一个问题。我们可以只保留一个对象或数组的索引吗?
    • "我们可以只保留一个对象或数组的索引吗?" ...首先,您不保留数组的索引。索引不是对象,您只能保留对象。其次,在回答另一个问题时,您保留一个数组,并且一个数组会自动保留您添加到该数组的所有内容(直到您将其从数组中删除或释放整个数组)。但是,如果您有一些对象既可以在数组中使用,又需要在其他地方声明所有权,那很好,它将被保留两次。
    • 对不起,我想接受,但我正在等待重播我的提交。
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 2018-11-23
    • 2015-05-07
    • 2013-12-29
    • 1970-01-01
    相关资源
    最近更新 更多