2009-07-08 53 views
1

我寫的應用程序是非常重的圖形,因此我試圖在我的視圖控制器中實現一個緩存機制,創建一個視圖,並保留它以供將來使用,類似以下內容:objective-c內存管理:緩存視圖元素

- (UIView *)logoView 
{ 
    if(_logoView == nil) 
    { 
     _logoView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"logo_header.png"]]; 
     _logoView.contentMode = UIViewContentModeCenter; 
    } 

    return _logoView; 
} 

這所有的作品充滿了想象,但是,我得到了一定的問題有點糊塗了;當我模擬內存警告我把它清除緩存的方法,像這樣:

- (void)purgeCachedContent 
{ 
    if(_logoView != nil)[_logoView release]; 
} 

然而,這似乎導致我的應用程序的問題,因爲它可以得到多次調用(dealloc中,didReceiveMemoryWarning和viewDidUnload) 。

如何確定是否存在實例向其發送釋放消息?即使當我嘗試使用NSLog發佈的視圖時,我也會收到EXC_BAD_ACCESS錯誤,所以我很難找出我要做的最好方法。我甚至刪除了希望依靠能夠發送零對象消息的if語句,但是這會導致相同的錯誤...

我確定這是從我的objective-c知識中缺少的簡單東西...我只是不知道什麼!

回答

3

_logoView只是通過釋放它而不會自動設置爲零,因此您嘗試使用該指針調用的任何未來方法都將轉到用於包含有效對象但現在包含垃圾的內存位置。您可以通過在釋放後設置_logoView = nil;來解決此問題。

0

如果你想緩存它,你爲什麼要釋放它?

只使用自動釋放的初始化:

_logoView = [[[UIImageView alloc] initWithImage: [UIImage imageNamed: @"logo_header.png"]] autorelease];