【问题标题】:What will happen to the previous memory of allocated objects?分配对象的先前内存会发生什么?
【发布时间】:2016-08-09 09:34:43
【问题描述】:

如果我有一个包含一些值的数组,即分配了一些内存。 如果我为数组分配新内存,之前的内存会发生什么。

self.array = [[NSMutableArray alloc] initWithObjects:anObject, nil];

self.array = [[NSMutableArray alloc] initWithObjects:anObject2, nil];

对象anObject的内存会发生什么变化,是保留在内存中还是在分配新内存后自动从内存中删除?

【问题讨论】:

  • 我想知道当这两行按照这个顺序编写时,编译器是否会以只执行第二个赋值的方式进行优化。
  • 非常基本的问题。您使用的是 ARC 还是 MRR?你有self.array 的自定义设置方法吗?您是否费心阅读任何文档?

标签: objective-c memory-management


【解决方案1】:

第一个数组上的对象@"1" 实际上是一个指向NSString 对象的指针。 一旦通过覆盖数组中的值释放指针,NSString 实例占用的内存将被释放。新的字符串对象 (@"2") 不必存储在同一内存中。

【讨论】:

    【解决方案2】:

    在第二次分配内存时,以前的数据将丢失,例如 self.array = [[NSMutableArray alloc] initWithObjects:@"2", nil];从以前的内存位置做这个对象 self.array = [[NSMutableArray alloc] initWithObjects:@"1", nil]; 将不复存在。

    【讨论】:

      【解决方案3】:

      object anObject的内存会发生什么变化,是保留在内存中还是在分配新内存后自动从内存中删除?

      这个问题无法明确回答,因为它取决于其他未知因素。

      我认为您试图理解的是数组的内存所有权模型(NSArray,`NSMutableArray)。希望这个猜测是正确的:

      首先考虑所有权。一个对象由它的第一个所有者创建,在其生命周期内可以有多个所有者,并且在没有所有者后的某个时间会死亡。在 ARC 下,您可以结合 strongweak 等属性来处理所有权。在 MRC 所有权下是手动使用的方法,例如 retainrelease

      数组,以及字典、集合等,使用模型:

      • 当一个项目被添加到集合中时,该项目的所有权被取得。

        • 当一个项目从集合中移除时,所有权被放弃。

        • 当一个集合本身变为无主时,它会放弃它包含的所有项目的所有权。

      因此,在您的特定情况下,anObject 会发生什么至少取决于:

      • 第一个NSMutableArray是否有其他所有者。

      • anObject 本身是否有其他所有者。

      还有一些对象实际上由应用程序拥有,因此它们似乎永远不会死掉(它们会在应用程序终止时死掉)。一个常见的不朽对象是一个字符串字面量,所以如果anObject 是一个字符串,它很可能会继续存在。

      HTH

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-06
        • 1970-01-01
        • 2014-12-20
        • 1970-01-01
        • 1970-01-01
        • 2011-11-21
        • 2011-04-11
        • 1970-01-01
        相关资源
        最近更新 更多