2014-05-14 67 views
0
-(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

如果您處於非ARC環境中,請將函數的return語句替換爲return [d2 autorelease]。在ARC上,你不需要做任何事情。

3

d2指針到分配的對象,所以你想要的是日誌價值d2, 不是它地址&d2

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

&d2是地址本地堆棧變量,並且可能對於每次調用都是相同的。)

0

顯然,您處於ARC環境中。一旦functionCheck保留,分配的空間就會被釋放,並且它的返回值(新分配的對象)不會被任何強引用存儲。 我們說沒有任何對象對新創建的UserDetail實例擁有所有權。

使用ARC可以免費銷燬對象。

沒有ARC它有點不同。除非返回值由調用者或其他地方釋放,否則您的代碼將在此處泄漏內存。 d2將保持全塗,儘管它不能從任何地方引用,並且下一次functionCheck被稱爲新對象將被分配並獲得不同的地址。

但你每時UserDetail一個新實例中functionCheck分配以及分配給d2時間得到相同的地址。這意味着此前的實例必須在此期間被釋放。

除非堆中的大部分被其他物體佔據,否則堆中其他物體可能已經被分配,或者堆的其他部分在此期間被釋放,每次一次又一次獲得相同的地址正是我會期待。儘管如此,我仍然必須看到其餘的代碼。

==>你的代碼很好。 UserDetail d2已按照您的要求解除分配。