2013-11-14 96 views
0

我正在開發一個IOS應用程序。我用XCode工具進行了分析,如果我不寫autorelease,然後顯示「潛在的內存泄漏」消息。這是以下代碼塊中的錯誤。我不確定。IOS @property,@synthesize內存泄漏

//TransferList.h 
@property (nonatomic,retain) WebServiceAPI *webApi; 


//TransferList.m 
@implementation TransferList 

@synthesize webApi; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.webApi = [[[WebServiceAPI alloc] init] autorelease]; 
} 

- (void)dealloc 
{  

    [webApi release]; 
    [super dealloc]; 
} 
+0

這不是一個巨大的東西,但通常你會做'@合成的WebAPI = _webApi;'我會得到的內存泄漏有時並改變這種方式似乎幫助。我相信'iOS6'這個是自動完成的,所以你根本不需要'@ synthesize'。 – Popeye

+0

也許你可以分享一些關於你的web服務類的細節。儀器會告訴你泄漏物體的分配位置,而不是泄漏的根源。你是否通過靜態分析器運行你的代碼(「分析」Xcode的「產品」菜單)?可能是一個保留週期(例如,引用'self'的塊變量)或類似重複保留Web服務對象的'NSTimer'。 – Rob

+0

另外,您是否確認視圖控制器本身正在發佈(即視圖控制器本身沒有保留週期)?也許在'dealloc'中放置斷點或'NSLog'並確保它被調用。 – Rob

回答

3

如果這是MRC下編譯(和它顯然是),然後在不autorelease會出現內存泄漏。這是絕對正確的。

alloc說你想要的對象
分配到這是retain財產的所有權還聲稱所有權(由酒店)
dealloc你釋放屬性(屬性不會擁有該對象的任何更)。

如果沒有autoreleaseviewDidLoad將永遠失去對象的所有權,你將有一個內存泄漏,因爲該對象永遠不會被釋放。

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    //create the object and get the ownership 
    WebServiceAPI *api = [[WebServiceAPI alloc] init]; 

    //let our property also own this object 
    self.webApi = api; 

    // I don't want to own the object anymore in this method 
    // (of course, using autorelease is simpler) 
    [api release]; 
} 

- (void)dealloc {  
    //our property doesn't want to own the object any more 
    [webApi release]; 
    [super dealloc]; 
} 
+0

是這個項目的非ARC項目。所以這是正確的? – hiwordls

+0

他已經有'autorelease'了。我懷疑他的web服務類中保留了循環。 – Rob

+0

@Sulthan所以這是正確的或不是「self.webApi = [[[WebServiceAPI alloc] init] autorelease];」 ? 。 – hiwordls