当运用数组等的时候 运用removeObject移除对象的时候事实上这些集合内部是有一个判断的;
这个判断是基于方法- (BOOL)isEqual:(id)object;的 而这个方法是判断内容是否相同。所以只要数组或者集合中有相同的元素,而你所要移除的对象正好在数组或者集合中有两个或者两个以上的时候,这些对象都将被移除。。。。
字符串:
NSString *str1=[[NSString alloc]initWithFormat:@"iphone"];
NSString *str2=[[NSString alloc]initWithFormat:@"iphone"];
NSString *str3=[[NSString alloc]initWithFormat:@"iphone"];
NSString *str4=[[NSString alloc]initWithFormat:@"ipad"];
NSMutableArray *array=[[NSMutableArray alloc]initWithObjects:str1,str2,str3,str4, nil];
NSLog(@"array=%@",array);
[array removeObject:str2];
NSLog(@"array=%@",array);
打印结果如下:
array=(iphone,iphone,iphone,ipad) 字符串比较 2[1746:303] array=(ipad)
所以要想移除某个确定的对象时请用 [array removeObjectAtIndex:0];
下面是NSString了
当用 NSString * str1=[[[ NSString alloc ] initWithString : @"iphone" ] retain ];
创建一个字符串时实质上和 NSString * str= @"iphone" ;是一样的;
例子:
//常量字符串没有引用计数这个概念,所以都是-1
NSString * str=@"iphone";NSLog(@"%ld,%p",[str retainCount],str);//而用initWithString+常量字符串方法初始化一个字符串对象,该对象指向常量字符串地址
NSString * str1=[[[NSString alloc]initWithString:@"iphone"] retain];
NSLog(@"%ld,%p",[str1 retainCount],str1);
NSString * str0=[[[NSString alloc]initWithString:@"iphone"] retain];
NSLog(@"%ld,%p",[str0 retainCount],str0);
NSString * str2=[[[NSString alloc]initWithString:str1] retain];
NSLog(@"%ld,%p",[str2 retainCount],str2);
他们的输出结果是:2013-08-09 14:39:46.204 TestNSString_RetainCount[1833:303] -1,0x100001078
2013-08-09 14:39:46.205 TestNSString_RetainCount[1833:303] -1,0x100001078
2013-08-09 14:39:46.206 TestNSString_RetainCount[1833:303] -1,0x100001078
引用计数和地址都一样的。。。。下面看下 initWithFormat :创建的字符串
NSString * str3=[[NSString alloc]initWithFormat:@"android"];
NSLog(@"%ld,%p",[str3 retainCount],str3);
NSString * str4=[[NSString alloc]initWithFormat:@"android"];
NSLog(@"%ld,%p",[str4 retainCount],str4);
打印结果如下:2013-08-09 18:17:55.882 TestNSString_RetainCount[2438:303] 1,0x10010bcc0
2013-08-09 18:17:55.884 TestNSString_RetainCount[2438:303] 1,0x100300720
我们再在上面代码下面加上以下三句。
NSString * str5=[[ NSString alloc ] initWithString :str4];
NSLog ( @"%ld,%p" ,[str5 retainCount ],str5);
NSLog ( @"%ld,%p" ,[str4 retainCount ],str4);
请看打印结果:
2013-08-09 18:22:10.754 TestNSString_RetainCount[2466:303] 1,0x10010bcc0
2013-08-09 18:22:10.756 TestNSString_RetainCount[2466:303] 1,0x100304680
2013-08-09 18:22:10.757 TestNSString_RetainCount[2466:303] 2,0x100304680
2013-08-09 18:22:10.757 TestNSString_RetainCount[2466:303] 2,0x100304680
因此我们可以总结出来initWithString对于initWithFormat创建的对象其实就是retain了一下,或者理解为浅拷贝了一下
下面我们用initWithFormat:创建initWithFormat:对象和initWithString:对象
NSString * str1=[[[NSString alloc]initWithString:@"iphone"] retain];
NSLog(@"%ld,%p",[str1 retainCount],str1);
NSString * str3=[[ NSString alloc ] initWithFormat : @"android" ];NSLog(@"%ld,%p",[str3 retainCount],str3);
我们在用以下代码创建str6和str7
NSString * str7=[[ NSString alloc ] initWithFormat : @"%@" ,str1]; NSLog ( @"%ld,%p" ,[str7 retainCount ],str7); NSLog ( @"%ld,%p" ,[str1 retainCount ],str1);
输出结果如下:
2013-08-09 18:31:17.321 TestNSString_RetainCount[2525:303] -1,0x100001078
2013-08-09 18:31:17.323 TestNSString_RetainCount[2525:303] 1,0x102300930
2013-08-09 18:31:17.324 TestNSString_RetainCount[2525:303] 1,0x102300bc0
2013-08-09 18:31:17.324 TestNSString_RetainCount[2525:303] 1,0x102300930
2013-08-09 18:31:17.325 TestNSString_RetainCount[2525:303] 1,0x102300c60
2013-08-09 18:31:17.325 TestNSString_RetainCount[2525:303] -1,0x100001078
对比数据可以看出
对于 initWithFormat :来讲它开辟了新的内存空间,并把内容复制过来了为深复制。