【问题标题】:Objective C memory management question with NSArray带有 NSArray 的 Objective C 内存管理问题
【发布时间】:2010-12-31 13:38:27
【问题描述】:

我正在加载一个带有这样的浮点数的数组:

NSArray *arr= [NSArray arrayWithObjects:
                [NSNumber numberWithFloat:1.9],
                [NSNumber numberWithFloat:1.7],
                [NSNumber numberWithFloat:1.6],
                [NSNumber numberWithFloat:1.9],nil];

现在我知道这是正确的做法,但是我对零售数量感到困惑。

  1. 每个对象都是由[NSNumber numberWithFloat:] 方法创建的。这使对象的保留计数为 1 dosnt 吗? - 否则对象将被回收

  2. arrayWithObjects: 方法向每个对象发送保留消息。

这意味着每个对象的保留连续为 2。当数组被解除分配时,每个对象都被释放,保留计数为 1。

我错过了什么?

【问题讨论】:

    标签: objective-c memory-management


    【解决方案1】:

    NSNumber numberWithFloat: 方法没有返回一个保留的对象。

    一般来说,除非您使用alloccopynew,否则您可以假定您得到的对象的保留计数为零。因此,唯一发生的保留是当 NSArray 将对象添加到其中时。

    有一个关于此类事情的好博客:http://interfacelab.com/objective-c-memory-management-for-lazy-people/

    【讨论】:

    • 好的,谢谢,我读了博客。 NSNumber numberWithFloat: 方法如何不返回保留对象?你怎么能实现这样的类方法?
    • @Robert - NSNumber 只是简单地返回一个对象,但您并没有“拥有”它,因为您没有自己创建它。 (如果您愿意,当然可以保留它。)
    • @Robert: 你可以很简单地实现它: +(id) numberWithFloat:(float)aFloat { return [[[self alloc] initWithFloat:aFloat] autorelease]; }
    • 这个答案具有误导性。更好的答案是 [NSNumber numberWithFloat:] 正在返回一个 autoreleased 对象。它实际上确实返回了一个保留计数为 1 的对象(如果您不相信我,请使用 gdb 检查它),但是已经调用了 autorelease。下次调用 -[NSAutoreleasePool drain] 时,对象的保留计数将减一。有关详细信息,请参阅 Apple 开发者网站上的“内存管理编程指南”。
    【解决方案2】:

    没有必要释放这些对象。
    arrayWithObjects:numberWithFloat: 创建不属于您的对象。

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多