Iphone objective-c内存管理:缓存视图元素

Iphone objective-c内存管理:缓存视图元素,iphone,objective-c,cocoa,cocoa-touch,Iphone,Objective C,Cocoa,Cocoa Touch,我正在编写一个图形化程度很高的应用程序,因此我试图在我的视图控制器中实现一种缓存机制,该机制只创建一次视图,并将其保留以备将来使用,类似于以下内容: - (UIView *)logoView { if(_logoView == nil) { _logoView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"logo_header.png"]]; _logoView.cont

我正在编写一个图形化程度很高的应用程序,因此我试图在我的视图控制器中实现一种缓存机制,该机制只创建一次视图,并将其保留以备将来使用,类似于以下内容:

- (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)

如何确定实例是否存在以向其发送发布消息?即使当我试图记录一个发布的视图时,我也会收到一个EXC_BAD_访问错误,所以我很难找到最好的方法。我甚至删除了if语句,希望能够发送nil objects消息,但这会导致相同的错误


我确信这是我的objective-c知识中缺少的东西。。。我只是不知道是什么

\u logoView不会仅仅通过释放它就自动设置为nil,因此您尝试使用该指针调用的任何未来方法都会转到一个内存位置,该内存位置以前包含有效对象,但现在包含垃圾。您可以通过设置
\u logoView=nil释放后。

如果要缓存它,为什么要释放它

只需在初始化时使用自动释放:

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