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;
}
答案 0 :(得分:5)
是的,您应该在main
中使用自动释放池。另一个问题是您没有在testFromNothing
初始化您的对象。
原因:您应该在输入线程的任何地方创建自动释放池(包括主线程)。当然,如果该线程只使用C代码,则不会自动释放objc对象,因此在这些情况下不需要。
关于“为什么?” - ARC还使用自动释放,并期望自动释放池始终存在。程序需要正确支持自动释放语义,因为ARC还假设它可能使用自动释放池,程序员有责任正确设置自动释放池(在某些情况下)。 ARC与GC不同,与MRC非常相似,涉及引用计数操作和引用计数操作发生的顺序。使用GC,可以使用几种收集方案(例如,您可以在收集之前看到大量增长,或者可以在辅助线程上进行收集),但ARC的操作类似于结构良好的保留/释放/自动释放操作 - 加上一些技巧/扩展。