1

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;
}
4

1 回答 1

5

是的,您应该在main. 另一个问题是您没有在testFromNothing.

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

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

于 2013-03-05T10:43:49.430 回答