Objective c iOS ARC_objc_rootRetainCount

Objective c iOS ARC_objc_rootRetainCount,objective-c,macos,automatic-ref-counting,retaincount,Objective C,Macos,Automatic Ref Counting,Retaincount,Xcode8,macos10.12。弧 我创建了一个MacOS命令行工具项目 这里是主功能 int main(int argc, const char * argv[]) { @autoreleasepool { id array = [[NSMutableArray alloc] init]; NSLog(@"array count is %lu", _objc_rootRetainCount(array)); _

Xcode8,macos10.12。弧

我创建了一个MacOS命令行工具项目

这里是
主功能

int main(int argc, const char * argv[]) {
    @autoreleasepool {
            id array = [[NSMutableArray alloc] init];
            NSLog(@"array count is %lu", _objc_rootRetainCount(array));
            _objc_autoreleasePoolPrint();
    }
    return 0;
}
结果如预期:

数组的重新计数为1,并且数组未注册到自动释放池

但是当我使用
id-array=[NSMutableArray]
时。结果发生了变化,并不像预期的那样

数组的重新计数为2,并且数组已注册到自动释放池

看起来这两个函数(
objc\u retainAutoreleaseReturnValue
objc\u retainAutoreleasedReturnValue
)不起作用


现在我创建了一个iOS应用程序。下面是viewDidLoad中的代码

- (void)viewDidLoad {
    // id __weak tmp = nil;
    id array = [NSMutableArray array];
    NSLog(@"%lu", _objc_rootRetainCount(array));
}
数组的重新计数为1


但是如果我取消了对行的注释
id\uu弱tmp=nil,结果更改为2。非常奇怪。

方便的初始值设定项返回一个自动释放的对象,因此您有
alloc init
中的保留计数,加上一个弧,以确保数组一直存在到代码中的最后一个引用。@Cristik我想当我使用
id array=[NSMutableArray]
返回对象不应是自动删除的对象。由于
objc\u retainutorereleasereturnvalue
objc\u retainutorereleasereturnvalue
@vanney,
[NSMutableArray array]
[[NSMutableArray alloc]init]自动释放]
事件的缩写,尽管
自动释放
不再可用。@Cristik。在ARC下,编译器和运行时相互协作,以避免在自动释放池中丢弃对象。所有这些都是实现细节,最终,重新计算是完全无用的。