代码之家  ›  专栏  ›  技术社区  ›  Dan Rosenstark

我需要释放吗?

  •  3
  • Dan Rosenstark  · 技术社区  · 14 年前

    在我为iphone dev学习的书中,他们利用 IBOutlet 使用接口生成器的实例。一个例子是 UIButton . 所以他们在结构中添加了如下内容:

     IBOutlet UIButton *whateverButton;
    

    然后他们加了一个 @property 对于.h和a中的每一个 @synthesize 在M。

    然后包括一个 release dealloc 两个问题:

    1. 需要释放吗?不是所有的属性都已经自动处理了吗?
    2. 为了调试目的,我如何检查ref计数以查看发生了什么…?
    3 回复  |  直到 14 年前
        1
  •  5
  •   zoul    14 年前

    需要释放吗?不是全部 已处理的属性 自动?

    如果保留该属性,则必须释放。当你宣布 @property @synthesize 它,你得到的只是访问器,在dealloc中没有特殊的自动行为。

    此外,iboutlet没有什么神奇之处,它只是界面生成器的一个标记,用于查看您希望在ib中显示哪些属性。它只是一个空宏,cmd单击iboutlet关键字以查看其定义:

    #ifndef IBOutlet
    #define IBOutlet
    #endif
    

    同样的事情也适用于iBaction,它扩展到 void .

    我怎么能查一下裁判人数 发生了什么,为了调试 目的…?

    当我需要调试内存管理时,我通常只是在dealloc方法中设置一个断点或在那里记录一个字符串。记录 retainCount 调用周围的对象可能会对其产生可疑的影响。


    这也可能有助于了解 @合成 指令创建访问器。当你宣布保留 @房产 并要求编译器 @合成 他们,你会得到这样的东西:

    @property(retain) NSString *foo;
    @synthesize foo;
    
    - (void) foo {
        return foo;
    }
    
    - (void) setFoo: (NSString*) newFoo {
        // Try to think what would happen if this condition wasn’t
        // here and somebody called [anObject setFoo:anObject.foo].
        if (newFoo == foo)
            return;
        [foo release];
        foo = [newFoo retain];
    }
    

    事实并非如此,但这已经足够接近了。现在应该更清楚为什么应该在dealloc中释放。

        2
  •  5
  •   Chuck    14 年前

    属性不是“自动处理”的。最接近实际情况的是,合成访问器正确地处理它们的内存管理职责。但那只是那些访问器。属性只是在类上声明可访问“对象”的一种方式。除此之外,他们没有什么特殊待遇。它不会启动某种垃圾收集。所以是的,释放是必要的。

    如果你想检查一个正在运行的应用程序是否有漏洞或者内存没有释放,你应该使用仪器之类的调试工具。我不会直接查看ref count,因为它几乎是危险的无用的-不能保证ref count在任何时候都是您所期望的,而且这并不一定表示有问题。

    你应该看看苹果的 memory management rules for Cocoa . 一旦你吸收了它就很简单了。我不一定建议您先阅读其他指南,因为细微的错误陈述可能会引导您走上错误的道路(例如,为您发布属性的想法可能来自于听到有人错误地陈述它们的工作方式)。

        3
  •  3
  •   Johannes Rudolph    14 年前

    需要释放吗?不是全部 已处理的属性 自动?

    这取决于如何实现属性。如果它是自动实现的( @synthesize 'd),属性将在setter中保留其值,并在设置为其他值时释放它。如果您刚刚学习了obj-c和cocoa,那么您应该阅读有关内存管理的约定。我放了一个 post 在我关于他们的博客上,其他地方也有很多资源。

    我怎么能查一下裁判人数 发生了什么,为了调试 目的…?

    您可以检查nsobject retaincount属性。这方面的信息是 here . 为了进行高级调试,存在nszombieenabled环境标志,该标志将导致所有释放消息在访问正常释放的对象时不会减少引用计数,而是记录错误。