【问题标题】:Deleting an object after creating a pointer to it [Objective-C] [duplicate]在创建指向它的指针后删除对象[Objective-C] [重复]
【发布时间】:2012-12-31 13:56:50
【问题描述】:

可能重复:
Does lastObject in NSMutableArray return a copy of the object?

我正在学习关于 iOS 开发的斯坦福课程,但我有疑问。 问题是我有一个带有“操作数”(NSNumbers)的数组(operandStack),我想要一个弹出最后一个元素然后从数组中删除它的函数。这就是教程所说的(并且有效):

- (double)popOperand
{
    NSNumber *operand = [self.operandStack lastObject];
    if(operand) [self.operandStack removeLastObject];
    return [operand doubleValue];
}

我的问题是:如果使用 NSNumber *操作数我们只是“指向”最后一个对象,并且在下一行中我们删除了最后一个对象,那么我们怎么可能返回它?我的意思是,如果我们删除最后一个对象并且操作数只是指向那个对象,那么操作数应该不指向任何东西,所以我不明白我们怎么可能返回操作数...... 如果操作数是数组的最后一个对象的副本,我会理解代码,但事实并非如此......

对不起我的英语:S 我希望我说清楚了。

谢谢,

卡洛斯

【问题讨论】:

  • 您对这个问题有何猜测?某种零?
  • 是的...我只是不明白为什么会这样!如果操作数指向一个被移除的对象,操作数应该是 nil 什么的,所以返回operand.doubleValue 应该什么都没有...

标签: iphone objective-c ios


【解决方案1】:

removeLastObject 方法从数组中删除一个对象,而不是从内存中。在从数组中删除对象之前,将其分配给局部变量。使用 ARC 编译时,指向对象的局部变量有一个隐式的生命周期限定符 __strong

由于您在将对象从数组中删除之前添加了对对象的强引用,因此您的方法会暂时获得它的所有权。即使该方法返回对象本身而不是其值,这仍然可以正常工作,因为 ARC 会在方法末尾插入一个 autorelease 调用而不是 release

【讨论】:

  • 认为您在 2 个帐户上错了。首先,这段代码可以在没有 ARC 的情况下完美运行,这意味着 ARC 不需要以任何方式更改它。其次,如果 ARC 将自动释放或释放添加到操作数对象,它会过度释放它,因为它已经是一个自动释放的对象。
  • @ValentinRadu 如果“在没有 ARC 的情况下完美工作”的意思是它会在调用 doubleValue 时崩溃,那么是的,它确实会这样做。关于第二点,ARC 使局部变量成为强引用,即调用retain,然后在方法末尾添加对releaseautorelease 的调用。这是怎么过度释放的?
  • @ValentinRadu 它可能不会像目前写的那样崩溃的原因是因为NSNumber 类缓存了它的实例,但如果集合中的对象没有被其他东西保留,它肯定会崩溃。
  • 你当然是对的,只要 'lastObject' 方法不返回自动释放的对象,你的答案是完全有效的,包括缓存添加。
猜你喜欢
  • 2011-05-02
  • 1970-01-01
  • 2016-10-24
  • 2019-10-11
  • 2013-09-09
  • 2010-09-08
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
相关资源
最近更新 更多