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

ssg*_*reg 1 memory objective-c 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;
}
Run Code Online (Sandbox Code Playgroud)

jus*_*tin 5

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

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

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

  • @trojanfoe这个假设在执行时可能是正确的,但它依赖于实现细节.无论如何,自动释放池应该存在于线程条目中,包括主线程. (2认同)
  • @trojanfoe通过命名约定和unattributed,`+ testFromNothing`返回一个自动释放的对象.如果它被命名为`+ newTestFromNothing`,则返回的值恰好被释放,尽管没有自动释放池.使用自动释放命名约定时,通过与非自动释放变体不同的行为返回参数.这实际上并不要求将对象放在池中.谷歌`objc_autoreleaseReturnValue`在这里详细说明了幕后发生的事情. (2认同)