【问题标题】:objective-c class variables: when is dealloc called?objective-c 类变量:何时调用 dealloc?
【发布时间】:2009-03-19 06:28:05
【问题描述】:

如果我在Objective-C中声明类变量,内存什么时候释放?

如果我的界面是:

@interface TestClass : NSObject
{
}

+ (NSString)instanceCount;

@end

在实现中,我声明:

static NSString instanceCount;

如何释放这个类级变量?即何时在 Objective-C 中为类变量调用 dealloc?

【问题讨论】:

  • 刚在学习Obj-C时遇到了这个问题。苹果似乎暗示没有“类变量”之类的东西,而您在接口中定义的是一个类方法,它与静态变量分开,因此需要在实施。静态变量仅限于实现文件的范围,而不是类本身。也许这是一个小问题,但它让我困惑了一秒钟:developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/…

标签: objective-c class variables static


【解决方案1】:

您的问题的简短回答是:“程序退出时。”

静态变量在程序的最开始分配,在main() 函数开始之前。同样,它们将在您的程序结束时发布,在main() 退出后不久。此内存管理由 Objective-C 运行时处理,这一切都发生在幕后。

如果您尝试监控此行为,您可能不会有太多运气。例如,如果您在自定义类中执行以下操作,然后将该类用作另一个类的静态成员:

- (void)dealloc
{
    NSLog(@"I am being deallocated");
    [super dealloc];
}

您永远不会在日志中看到此消息。这有几个原因。一,NSLog() 需要的变量可能已经作为正常关闭过程的一部分被释放。第二,因为运行时系统可以简单地一次性释放所有剩余内存,而无需费心调用dealloc 方法。

如果您的自定义类在其dealloc 方法中做了一些重要的事情,这可能会出现问题。如果是这种情况,请考虑编写一个自定义的 cleanup 方法,在程序退出之前调用这些对象。

【讨论】:

  • 更不用说 dealloc 是一个实例方法,并且可以为类调用 0 或 100 次
  • 嗯,是的,但我在一个对象中考虑这个方法,该对象被用作另一个类的静态成员。我(希望)在我的回答中澄清了这一点。感谢您指出!
猜你喜欢
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多