【问题标题】:objective-c memory management: caching view elementsObjective-C 内存管理:缓存视图元素
【发布时间】:2009-07-08 16:33:03
【问题描述】:

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

- (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 错误,所以我很难找出最好的方法。我什至删除了希望依赖能够发送 nil 对象消息的 if 语句,但这会导致相同的错误...

我确信这是我的 Objective-c 知识中缺少的一些简单的东西......我只是不知道是什么!

【问题讨论】:

    标签: iphone objective-c cocoa cocoa-touch


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多