代码之家  ›  专栏  ›  技术社区  ›  Tricky

Objective-C内存管理:缓存视图元素

  •  1
  • Tricky  · 技术社区  · 15 年前

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

    - (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];
    }
    

    但是,这似乎导致了我的应用程序问题,因为它可以被多次调用(dealoc、didReceiveMemoryWarning和viewdidUnload)。

    如何确定实例是否存在以向其发送发布消息?即使当我试图nslog一个已发布的视图时,我也会收到一个exc-bad-access错误,所以我很难找到最好的方法。我甚至删除了if语句,希望依赖于能够发送nil对象消息,但这会导致相同的错误…

    我确信这是我的客观知识所缺少的东西…我就是不知道!

    2 回复  |  直到 15 年前
        1
  •  3
  •   Marc Charbonneau    15 年前

    _ Logoview不会仅仅通过释放就自动设置为nil,因此将来您尝试使用该指针调用的任何方法都将转到以前包含有效对象但现在包含垃圾的内存位置。您可以通过设置修复此问题 _logoView = nil; 释放后。

        2
  •  0
  •   carnz    15 年前

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

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

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