str之所以打印出来是-1,是因为它的retainCount=NSUIntegerMax,对NSString而言,只有当你调用format,或mutable关键字的时候,才会重新分配内存,如果你是调用这个方法"initWithFormat:",这其实是mutable操作,它内部会复制string然后分配内存,此时才会retainCount = 1,你如果要测试retainCount,不要用NSString来测试,你不了解的话会有很多意外的问题发生

解决方案 »

  1.   

     NSLog(@"%zi",[arr indexOfObject:@"2"]);//计数为1  这个应该就不用解释 了吧 
    NSString *str = [[NSString alloc]init];
    等效 NSString *str = @"";    
     @"" 属于静态区常量 ,retainCount 为 无效的值 ,也就是 常驻内存的意思NSLog(@"%zi",(unsigned long)[arry retainCount]);//计数为2 ,这个引用计数 为二  ,你应该用的 是 ARC 吧 ,这个我就不是很 清楚了 ,如果 不用 ARC 的话 ,应该 是 1
      

  2.   

    显然他用的不是ARC,ARC不会允许显式调用retainCount的
      

  3.   

    关于[[NSArray alloc]init]这种情况,我的理解是iOS可能比较聪明,它并没有重要分配一块内存区域,因为它知道你要的是一个空数组,所以它内部就重用了一个空数组,除非你在后期用mutableCopy,否则你也不会真正用这个数组,因为它不是mutable的,你无法往里面添加元素。
      

  4.   

    根据我自己曾经的测试,我也发现如果是[[NSArray alloc]init]这样的方式去创建一个空数组,它们指向的是同一个对象,也就是:NSArray *arry = [[NSArray alloc]init];
    NSArray *arry1 = [[NSArray alloc]init];
    NSArray *arry2 = [[NSArray alloc]init];它们三个是同一个对象