关于removeObject

本文深入探讨了Objective-C与Swift在iOS开发领域的应用差异,包括历史背景、语法特性、社区生态、性能表现及未来趋势。通过对比分析,帮助开发者做出更适合项目需求的技术选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当运用数组等的时候 运用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:来讲它开辟了新的内存空间,并把内容复制过来了为深复制。
NSURLSessionTask *sessionTask = [_sessionManager POST:URL parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { for (NSUInteger i = 0; i < images.count; i++) { // 图片经过等比压缩后得到的二进制文件 NSData *imageData = UIImageJPEGRepresentation(images[i], imageScale ?: 1.f); // 默认图片的文件名, 若fileNames为nil就使用 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"yyyyMMddHHmmss"; NSString *str = [formatter stringFromDate:[NSDate date]]; NSString *imageFileName = NSStringFormat(@"%@%ld.%@",str,i,imageType?:@"jpg"); [formData appendPartWithFileData:imageData name:name fileName:fileNames ? NSStringFormat(@"%@.%@",fileNames[i],imageType?:@"jpg") : imageFileName mimeType:NSStringFormat(@"image/%@",imageType ?: @"jpg")]; } } progress:^(NSProgress * _Nonnull uploadProgress) { //上传进度 dispatch_sync(dispatch_get_main_queue(), ^{ progress ? progress(uploadProgress) : nil; }); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (_isOpenLog) {PPLog(@"responseObject = %@",responseObject);} [[self allSessionTask] removeObject:task]; success ? success(responseObject) : nil; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if (_isOpenLog) {PPLog(@"error = %@",error);} [[self allSessionTask] removeObject:task]; failure ? failure(error) : nil; }]; // 添加sessionTask到数组 sessionTask ? [[self allSessionTask] addObject:sessionTask] : nil ; return sessionTask;能否异步多线程上传
最新发布
07-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值