对象引用在函数调用中是相同的

时间:2014-05-14 11:52:22

标签: objective-c object-reference

 -(UserDetail *)functionCheck :(NSString *)str
 {
    UserDetail *d2=[[UserDetail alloc] init];
    NSLog(@"check address::::::> %p",&d2);
    d2.auth_token=str;
    return  d2;

 }

每当我调用functionCheck()函数打印相同的地址

检查地址::::::> 0xbfffd500

表示它分配相同的地址。 如何在返回后释放UserDetail d2对象。

3 个答案:

答案 0 :(得分:3)

d2是分配对象的指针,所以你想要的是记录d2, 不是地址 &d2

NSLog(@"check address::::::> %p", d2); // remove the & !

&d2是本地堆栈变量的地址,每次调用可能相同。)

答案 1 :(得分:0)

如果您处于NON-ARC环境中,请使用return [d2 autorelease]替换函数的return语句。在ARC上,你不需要做任何事情。

答案 2 :(得分:0)

显然您处于ARC环境中。一旦保留functionCheck,分配的空间就会被释放,并且它的返回值(新分配的对象)不会被任何类型的强引用存储。 我们说没有对象取得新创建的UserDetail实例的所有权。

使用ARC,对象随后可以自由销毁。

没有ARC它有点不同。除非调用者或其他地方释放返回值,否则您的代码将在此处泄漏内存。虽然d2无法在任何地方引用,但functionCheck仍然会被覆盖,而下次UserDetail被称为新对象将被分配并获得不同的地址。

但是,每次functionCheck中分配d2的新实例并将其分配给UserDetail d2时,您的地址都会获得相同的地址。这意味着早期的实例必须在此期间被释放。

除非堆的很大一部分被其他可能在其间分配的对象占用,或者堆的其他部分在此期间被释放,所以每次一次又一次地获取相同的地址正是我想要的期望。不过,我必须看到剩下的代码。

==>你的代码很好。 {{1}}已根据您的要求解除分配。