在objective-c中,如果一个对象被多次引用,是否可以释放它?

时间:2011-04-26 14:10:16

标签: objective-c

例如;

TheClass * aInstance = [[TheClass alloc] init];
TheClass * bInstance;
bInstance = aInstance;
[bInstance release]

在这种情况下,是否会释放由aInstance分配的内存?

6 个答案:

答案 0 :(得分:2)

是的,它会是,因为只有一个实例 - 你只有两个不同的指针。


与普通C一样,将某个对象的地址(指针)分配给不同的变量与该对象的实际内存分配无关。在Objective-C中,同样的概念适用。如果你想“保留”对一个对象的两个不同的引用,你需要让两个引用“拥有”它。在这种情况下,可能是因为您将第二个引用retain作为对象,可能是因为您将它存储在实例变量等中。

答案 1 :(得分:2)

是。

听起来你对发生的事情感到有点困惑,所以我会解释一些事情:

  1. aInstance未分配内存。这只是内存中的一个数字。内存实际上是由TheClass类分配的。
  2. 分配方法在完全独立的内存部分中分配了一块内存,并返回该块的位置作为该方法的结果。
  3. aInstance只保留该位置(这是一个很大的数字)。而已。此数字被解释为指针(即对内存中另一个位置的引用),但不一定如此。如果您喜欢冒险,可以将它用作int。
  4. 执行:bInstance = aInstance;时,您只是将该号码从一个内存插槽复制到另一个内存插槽。你没有对该变量的对象引用做任何事情。你只是复制一个已经存在的指针。
  5. 当您释放该对象时,它将被释放,因为只有一件东西拥有它(您通过调用分配方法)。
  6. 释放一个对象对引用它的东西没有任何作用,因此你的变量仍将包含对象过去所在位置的现在存在的地址。换句话说,它们是“悬空”或“陈旧”指针,建议您将它们归零(通过为它们分配nil)。
  7. 哇,这是iPhone键盘的很多打字。 :P

答案 2 :(得分:0)

是。您只初始化了一次,并且只发布一次。所以保留计数为0。

规则是:

  • alloc将保留计数设置为1
  • 调用“保留”会增加保留计数1
  • Callng“release”将减少保留计数1
  • 如果retaincount在版本0之后,则删除对象。

答案 3 :(得分:0)

是的,它会被释放,并且在发布后不应安全使用aInstance而不是bInstance

答案 4 :(得分:0)

TheClass * aInstance = [[TheClass alloc] init]; //retain count = 1

TheClass * bInstance; //this is a pointer so retain count remain 1
bInstance = aInstance; //the pointer refer to the instance (retain count =1)
[bInstance release] //release => retain count =0, object released

答案 5 :(得分:0)

是的,它将被释放。

如果你更换“bInstance = aInstance;”用:

bInstance = [aInstst retain];

在您再次释放内存之前,它不会释放内存。虽然您可能希望将自动释放用于短期使用。