【问题标题】:is removeFromSuperview releases the object?removeFromSuperview 是释放对象吗?
【发布时间】:2011-12-03 07:53:19
【问题描述】:

我正在使用removeFromSuperview 从其父视图中删除视图。我还在该对象上使用了removeFromSuperview 之后的release,有时它工作正常,但有时访问不正确。

removeFromSuperview 也调用release 到对象?

【问题讨论】:

    标签: iphone objective-c memory-management


    【解决方案1】:

    是的,removeFromSuperview 也会发布视图。

    您需要在将视图添加到其父视图后释放它。

    CGRect frame; // let's assume you already have defined frame and superview
    UIView *superview;
    
    UIView *subview = [[UIView alloc] initWithFrame:frame];
    [superview addSubview:subview];
    [subview release];
    

    或者在创建视图时只使用autorelease

    UIView *subview = [[[UIView alloc] initWithFrame:frame] autorelease];
    [superview addSubview:subview];
    

    在这两种情况下,您都不需要在调用removeFromSuperview 之后再调用release

    【讨论】:

      【解决方案2】:

      是的,addSubview 调用保持,removeFromSuperview 调用释放。所以你对 release 的调用不属于那里(它可能在你分配子视图之后属于,假设你不想持有该对象)。

      【讨论】:

        【解决方案3】:

        正确答案是“可能”。这是您甚至不应该真正考虑的实现细节。如果您的代码需要与子视图一起使用,那么您应该在开始处理它之前保留它,并且您应该在完成使用它时释放它(这可能与从它的超级视图中删除它一致,也可能不一致)。

        我想测试会显示 removeFromSuperview 确实释放了视图,但你不能依赖这种行为,也不应该假设它会发生。即使它现在总是发生,将来也可能不会发生。

        您甚至不需要考虑这样低级别的内存管理。如果您使用retaincopyallocnew 保留该对象,那么您有责任在将来的某个时候使用release 来抵消它。

        如果你没有做任何这些事情,那么你不应该发布它。将子视图添加到视图的方法的名称中不包含 retaincopy,因此当您将其从超级视图中删除时,您应该自己释放它。

        视图系统非常复杂,尤其是在 RAM 如此有限且存储空间不足以使用虚拟内存的 iPhone 上。遵守规则,你应该没问题。或者启用 ARC。

        【讨论】:

          【解决方案4】:

          实际上removeFromSuperview减少了视图对象的retainCount属性,所以release

          所以,如果你按照 Aleksejs 所说的那样去做。

          UIView *subview = [[UIView alloc] initWithFrame:frame];
          [superview addSubview:subview];
          [subview release];
          

          subview -> alloc= retainCount = +1 ,

          subview -> addSubView = retainCount = +1

          subview -> release = retainCount = -1。

          subview -> removeFromSuperView = retainCount = -1

          (从内存中删除子视图)

          【讨论】:

          猜你喜欢
          • 2010-11-23
          • 2010-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-07
          • 2012-10-06
          • 2011-02-15
          相关资源
          最近更新 更多