新手,请大家帮忙解答一下,不甚感激

jkw5201314 2014-08-04 09:55:08
NSArray *arr = [NSArray arrayWithObjects:@"1",@"2", nil];
NSLog(@"%zi",[arr indexOfObject:@"2"]);//计数为1
NSString *str = [[NSString alloc]init];
NSArray *arry = [[NSArray alloc]init];
NSLog(@"%zi",(unsigned long)[str retainCount]);//计数为-1
NSLog(@"%zi",(unsigned long)[arry retainCount]);//计数为2
这是怎么回事啊
...全文
63 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bannings 2014-08-04
  • 打赏
  • 举报
回复
根据我自己曾经的测试,我也发现如果是[[NSArray alloc]init]这样的方式去创建一个空数组,它们指向的是同一个对象,也就是:

NSArray *arry = [[NSArray alloc]init];
NSArray *arry1 = [[NSArray alloc]init];
NSArray *arry2 = [[NSArray alloc]init];
它们三个是同一个对象
Bannings 2014-08-04
  • 打赏
  • 举报
回复
关于[[NSArray alloc]init]这种情况,我的理解是iOS可能比较聪明,它并没有重要分配一块内存区域,因为它知道你要的是一个空数组,所以它内部就重用了一个空数组,除非你在后期用mutableCopy,否则你也不会真正用这个数组,因为它不是mutable的,你无法往里面添加元素。
Bannings 2014-08-04
  • 打赏
  • 举报
回复
引用 2 楼 xiaofei125145 的回复:
NSLog(@"%zi",[arr indexOfObject:@"2"]);//计数为1 这个应该就不用解释 了吧 NSString *str = [[NSString alloc]init]; 等效 NSString *str = @""; @"" 属于静态区常量 ,retainCount 为 无效的值 ,也就是 常驻内存的意思 NSLog(@"%zi",(unsigned long)[arry retainCount]);//计数为2 ,这个引用计数 为二 ,你应该用的 是 ARC 吧 ,这个我就不是很 清楚了 ,如果 不用 ARC 的话 ,应该 是 1
显然他用的不是ARC,ARC不会允许显式调用retainCount的
滴水成川 2014-08-04
  • 打赏
  • 举报
回复
NSLog(@"%zi",[arr indexOfObject:@"2"]);//计数为1 这个应该就不用解释 了吧 NSString *str = [[NSString alloc]init]; 等效 NSString *str = @""; @"" 属于静态区常量 ,retainCount 为 无效的值 ,也就是 常驻内存的意思 NSLog(@"%zi",(unsigned long)[arry retainCount]);//计数为2 ,这个引用计数 为二 ,你应该用的 是 ARC 吧 ,这个我就不是很 清楚了 ,如果 不用 ARC 的话 ,应该 是 1
Bannings 2014-08-04
  • 打赏
  • 举报
回复
str之所以打印出来是-1,是因为它的retainCount=NSUIntegerMax,对NSString而言,只有当你调用format,或mutable关键字的时候,才会重新分配内存,如果你是调用这个方法"initWithFormat:",这其实是mutable操作,它内部会复制string然后分配内存,此时才会retainCount = 1,你如果要测试retainCount,不要用NSString来测试,你不了解的话会有很多意外的问题发生
jkw5201314 2014-08-04
  • 打赏
  • 举报
回复
嗯,谢谢楼上为我解答, 弄明白了,虽然更深层的内存方面还是半知不解,但刚开始慢慢学吧

29,031

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧