-(UserDetail *)functionCheck :(NSString *)str
{
UserDetail *d2=[[UserDetail alloc] init];
NSLog(@"check address::::::> %p",&d2);
d2.auth_token=str;
return d2;
}
每当我调用functionCheck()函数打印相同的地址
检查地址::::::> 0xbfffd500
表示它分配相同的地址。 如何在返回后释放UserDetail d2对象。
答案 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}}已根据您的要求解除分配。