ARC已启用。为什么'dealloc'方法不调用?

时间:2013-03-05 10:40:29

标签: objective-c memory automatic-ref-counting

ARC已启用。为什么'dealloc'方法不调用?我应该在这里使用 @autoreleasepool 吗?为什么? 谢谢。

@interface Test : NSObject
@end

@implementation Test

+(id)testFromNothing
{
  id res = [Test alloc];
  return res;
}

-(void)dealloc
{
  NSLog(@"deallocated");
}

@end


int main(int argc, const char * argv[])
{
  Test* test = [Test testFromNothing];
  return 0;
}

1 个答案:

答案 0 :(得分:5)

是的,您应该在main中使用自动释放池。另一个问题是您没有在testFromNothing初始化您的对象。

原因:您应该在输入线程的任何地方创建自动释放池(包括主线程)。当然,如果该线程只使用C代码,则不会自动释放objc对象,因此在这些情况下不需要。

关于“为什么?” - ARC还使用自动释放,并期望自动释放池始终存在。程序需要正确支持自动释放语义,因为ARC还假设它可能使用自动释放池,程序员有责任正确设置自动释放池(在某些情况下)。 ARC与GC不同,与MRC非常相似,涉及引用计数操作和引用计数操作发生的顺序。使用GC,可以使用几种收集方案(例如,您可以在收集之前看到大量增长,或者可以在辅助线程上进行收集),但ARC的操作类似于结构良好的保留/释放/自动释放操作 - 加上一些技巧/扩展。