objective-c - [[NSDictionary alloc] init]后引用计数是几

【字号: 日期:2023-12-21浏览:44作者:雯心

问题描述

NSDictionary *dictA =[[NSDictionary alloc] initWithObjectsAndKeys:@'1',@'two', nil];NSLog(@'dictA retain count is %d',[dictA retainCount]);NSDictionary *dictB =[[NSDictionary alloc] init];NSLog(@'dictB retain count is %d',[dictB retainCount]);

问:NSLog出来分别是几?为什么?

问题解答

回答1:

首先,两个输出,第一个应该是 1,第二个应该是。。。没准,反正一般比 1 大。原因是这样的:当你初始化一个 NSDictionary 实例以后,这个实例就不可变了,也就是说这东西一旦产生,那么在内存中的信息就是固定的。而 objective-c 为了节省内存,会把所有这种不可变的,相同实例的指针指向同一块内存。所以,当你 dictB 初始化一个空 NSDictionary 的时候,并没有真的去创建一个新的实例,而是指向了历史上已经存在的实例,而这个实例的 RC 加1。你第一个 dictA 创建的对象,看样子不会有重复的对象,所以是一个新的实例,如果你这样

NSDictionary *dictC =[[NSDictionary alloc] initWithObjectsAndKeys:@'1',@'two', nil];NSLog(@'dictC retain count is %d',[dictC retainCount]);

那么这个打印出来就应该是2了,是 dictA 的 RC + 1 。

与之对应的,Mutable 的实例,就不会有这种情况,每次新建都是一个新实例,因为他在生命周期里随时会发生变化。

相关文章: