关于removeObject

当运用数组等的时候 运用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:对象


首先分别用 initWithString :和 initWithFormat :创建str1和str3;

  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 * str6=[[ NSString alloc ] initWithFormat : @"%@" ,str3]; NSLog ( @"%ld,%p" ,[str6 retainCount ],str6); NSLog ( @"%ld,%p" ,[str3 retainCount ],str3);
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 :来讲它开辟了新的内存空间,并把内容复制过来了为深复制。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值