【问题标题】:UIView and memory managementUIView 和内存管理
【发布时间】:2011-05-13 14:55:11
【问题描述】:

关于如何在使用包含几个图像(约 500K)的 UIView 时提高内存效率的初学者问题。我想如果我以错误的方式处理这个问题并调用这个视图十到二十次,我的应用程序将会崩溃(因为我已经泄漏了大约 5-10 MB 的 RAM)。

我有一个 UIView,我像这样以编程方式创建:

myView = [[UIView alloc] initWithFrame:0,0,0,0];

我在这个视图中添加了几个图像,这样它会占用 500K 的内存。在我完成这个视图之后,我想再次释放内存。所以我编码了:

[myView removeFromSuperview];
myView = nil;
[myView release];

这是要走的路吗?我对上次发布电话特别不确定。如果我将 myView 从我的 superview 中删除并将其设置为 nil,它是否尚未发布?

另外,在第一个实例中简单地自动释放 myView 是否是个好主意,即

myView = [[[UIView alloc] initWithFrame:0,0,0,0] autorelease];

如有任何建议和更正,我将不胜感激。

【问题讨论】:

    标签: iphone objective-c cocoa-touch memory-management


    【解决方案1】:

    您正在向nil 发送release 消息。这些语句的正确顺序是:

    [myView removeFromSuperview];
    [myView release];
    

    之后可选:

    myView = nil;
    

    关于为什么设置为nil的讨论:

    当您将其添加为子视图时,超级视图会保留您的视图,然后在您将其删除时释放它。您仍然需要释放对它的控制。您可以在分配它时使用autorelease,但由于您需要持有指向它的指针才能发送removeFromSuperview,正确的方法是在完成该指针后发送release(然后将该指针设置为nil)。

    【讨论】:

      【解决方案2】:

      如果在调用release 之前将视图设置为nil,则会泄漏视图,然后向nil 发送消息。首先你必须释放视图:

      [myView removeFromSuperview];
      [myView release];
      

      然后您可以将变量设置为nil 以避免向已释放的实例发送消息。

      【讨论】:

        【解决方案3】:

        关于自动释放,我认为这只是个人喜好问题,但我发现这样做时跟踪内存问题要容易得多:

        myView = [[[UIView alloc] initWithFrame:0,0,0,0] autorelease];
        // add myView to wherever it belongs
        .....
        [myView removeFromSuperview];
        myView = nil;
        

        正如其他人指出的那样,在调用release 之前设置为myViewnil 是不正确的,并且会泄漏内存。

        【讨论】:

          猜你喜欢
          • 2012-01-12
          • 1970-01-01
          • 2016-10-12
          • 2021-01-23
          • 2013-01-17
          • 2011-02-18
          • 2011-07-01
          • 2019-11-10
          • 2011-02-05
          相关资源
          最近更新 更多