2010-04-20 193 views
1

我正在檢查我的代碼並嘗試處理正確的內存管理。此代碼:iPhone - 內存管理問題

imageView = [[[UIImageView alloc] initWithImage:myImage] autorelease]; 

導致我的應用程序崩潰。我在導航欄控制器中使用多個視圖控制器。該應用程序工作正常:我可以從第一個視圖控制器(tableview)中選擇一個人,它將我放到那些人照片的列表中,然後我可以從該視圖控制器(tableview)中選擇一張照片並移動到最終視圖用於查看照片的滾動視圖。有一次,我打回導航欄上一個視圖負載(在一個tableview中的照片列表),但是應用程序崩潰右側前行使用此代碼取消:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    if(RowSelected != nil) 
    { 
     [MainTableView deselectRowAtIndexPath:RowSelected animated:YES]; 
    } 
} 

選定的行存儲,當用戶點擊一排。

如果我離開的代碼爲:

imageView = [[UIImageView alloc] initWithImage:myImage]; 

該應用程序運行正常。難道我做錯了什麼?我不需要自動釋放這個嗎?

回答

3

請確保您在視圖控制器的-loadView-viewDidLoad中創建該視圖,而不是在其初始化程序中。當控制器的視圖離屏時,它通常會被釋放,然後釋放其子視圖;因此,你不應該期望你參考imageView保持有效。如果由於某種原因需要圖像視圖留在內存中,即使視圖控制器不在屏幕上,也可以在創建時不要調用-autorelease;請確保在您的控制器的-dealloc中撥打[imageView release];

0

當您將imageView標記爲autorelease時,它將在下一次通過運行循環時被釋放。如果您仍然在某處引用或使用imageView,那麼您正在使用指向已釋放的堆空間的指針。堆空間將被覆蓋(遲早),您將引用垃圾和崩潰。

我認爲正確的解決方案是imageView應該是保留的屬性,但我不確定你在用imageView做什麼,所以我只是在這裏猜測。如果您將imageView添加到您的視圖控制器視圖中,它將保留在子視圖數組中。底線,它必須由誰使用它保留。

你會做的ImageView在.h文件中所保持的屬性:

@property (nonatomic, retain) UIImageView* imageView; 

然後用二傳手,將保留它:

UIImageView* tmpIV = [[UIImageView alloc] initWithImage:myImage]; 
self.imageView = tmpIV; // copy the pointer, setter will retain it 
[tmpIV release];   // release the original alloc 

別忘了@合成創建設置者/吸氣者。

0

ImageView在我的.h。我使用這條線在我的-viewDidLoad,一旦它進入屏幕外我不需要的觀點:

imageView = [[[UIImageView alloc] initWithImage:myImage] autorelease]; 

我認爲,我做的是分配分配的UIImageView我的ImageView,如果我自動釋放,然後retaincount會關閉,因爲我的-dealloc版本?(corret我,如果我錯了)

如果我檢查我的-dealloc:

- (void)dealloc { 
NSLog(@"%i", [photo retainCount]); 
[photo release]; 

NSLog(@"%i", [imageView retainCount]); 
[imageView release];  
[super dealloc]; 

}

中的ImageView的retaincount是的NSLog 1,即時消息猜測,當它做的[超級dealloc]它試圖從imageView取得1個更多的保留計數,因爲[imageView版本]它已經是0了?

如果我有行:imageView = [[UIImageView alloc] initWithImage:myImage]; 然後保留計數是在的NSLog 2,1進入的[晚飯的dealloc]

如果我使用kk6yb的方法,則該應用程序的工作沒有問題,不過我認爲我不應該這樣做,因爲使用他的方式,如果我檢查我的保留計數dealloc它也是2在NSLog ...

我很困惑,我很多內存管理昨天爲了更好地掌握事物,因爲我在-dealloc中釋放imageView,我相信我不需要在該行上自動釋放?

有沒有辦法來檢查xCode中的內存泄漏?

謝謝!