您好,匿名用户
随意问技术百科期待您的加入

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

0 投票
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出来分别是几?为什么?

用户头像 提问 2012年 12月1日 @ Brand 上等兵 (185 威望)
分享到:

1个回答

0 投票
 
最佳答案

首先,两个输出,第一个应该是 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 的实例,就不会有这种情况,每次新建都是一个新实例,因为他在生命周期里随时会发生变化。

用户头像 回复 2012年 12月1日 @ Katarina 上等兵 (271 威望)
选中 2012年 12月1日 @Brand
提一个问题:

相关问题

+1 投票
1 回复 36 阅读
用户头像 提问 2012年 12月1日 @ dongxl 上等兵 (120 威望)
+1 投票
1 回复 48 阅读
用户头像 提问 2012年 12月26日 @ Ares 上等兵 (353 威望)
0 投票
1 回复 43 阅读
0 投票
1 回复 41 阅读
用户头像 提问 2012年 12月1日 @ Shyvana 上等兵 (214 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...