[nsurl urlwithString:] 返回结果为nil

本文介绍了一个使用NSURL URLWithString拼接URL时遇到返回nil的问题,并提供了解决方案。通过将字符串进行百分比转义处理后再创建NSURL对象,可以避免因特殊字符导致的nil值问题。

今天在使用URLWithString拼接NSURL的时候出现了nil:

[objc]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@?%@",host_url,baseurl,postURL]];  


查了一下原因:

This method expects URLString to contain any necessary percent escape codes, which are ‘:’, ‘/’, ‘%’, ‘#’, ‘;’, and ‘@’. Note that ‘%’ escapes are translated via UTF-8.



大概的意思是说,转义方面的,但并非我这里拼接为nil的原因。不过他给的解决方案缺让我最终拼接的NSURL不为nil了。。


所以以后在使用URLWithString来拼接NSURL尽量这样用:
[objc]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. // 这样用,就不容易出现像上面的问题  
  2.         NSString *urlStr = [NSString stringWithFormat:@"%@%@?%@", host_url, baseurl, postURL];  
  3.         urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
  4.         NSURL *url = [NSURL URLWithString:urlStr];  


这样就不容易出现URLWithString拼接NSURL为nil的情况,至少我这里就不会出现了。。
0
- (void)savePictureToLoacal:(UIImage *)image shareType:(ShareType)shareType{ PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus]; if (status == PHAuthorizationStatusRestricted || status == PHAuthorizationStatusDenied){ // 无权限 做一个友好的提示 UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"请您设置允许该应用访问您的相机\n设置>隐私>相机" message:nil preferredStyle:UIAlertControllerStyleAlert]; [alertController addAction:[UIAlertAction actionWithTitle:ATLocalizedStr(@"确定") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil]; }]]; [[KDUserInterfaceTool currenrtopViewController] presentViewController:alertController animated:YES completion:nil]; return; } WS(weakSelf) [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ [PHAssetChangeRequest creationRequestForAssetFromImage:image]; } completionHandler:^(BOOL success, NSError * _Nullable error) { if (success) { dispatch_async(dispatch_get_main_queue(), ^{ [ATHUD showSuccessWithStatus:@"保存图片成功!"]; if(shareType != ShareTypeToSavePictureLocal){ [weakSelf openShareProgram:shareType]; } }); }else { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil]; } }]; }的[PHAssetChangeRequest creationRequestForAssetFromImage:image];出现 vImage __ERROR_Buffer_Not_Writeable_By_vImage__CheckBacktrace + 20 1 vImage _vImageDebug_CheckDestBuffer + 376 2 vImage _vImageConvert_AnyToAny + 1252 3 ImageIO iio_vImageConvert_AnyToAny(vImageConverter*, vImage_Buffer const*, vImage_Buffer const*, void*, unsigned int) + 220 4 ImageIO IIOColorConverter::colorConvert(vImage_Buffer*, vImage_Buffer*) + 28 5 ImageIO IIOImageDestination::createPixelDataProviderConforming(CGImage*, long, CGColor*, CGImagePluginWriteModes, IIODictionary*) + 4816 6 ImageIO IIOImageDestination::addImage(CGImage*, IIODictionary*, bool) + 3312 7 ImageIO _CGImageDestinationAddImage + 492 8 PhotoLibraryServices _imageDataFromImageWithFormatAndProperties + 112 9 PhotoLibraryServices _imageDataFromImageRef + 588 10 Photos _ImageDataFromImageAsScreenshot + 176 11 Photos +[PHAssetCreationRequest creationRequestForAssetFromImage:] + 28 12 shandongMarket __53-[ATScrollViewImgZoom savePictureToLoacal:shareType:]_block_invoke_2 (ATScrollViewImgZoom.m:231) 13 Photos ___51-[PHPhotoLibrary performChanges:completionHandler:]_block_invoke + 44 14 AssetsLibraryServices ___pl_dispatch_async_block_invoke + 36 15 libdispatch.dylib __dispatch_call_block_and_release + 24 16 libdispatch.dylib __dispatch_client_callout + 16 17 libdispatch.dylib __dispatch_lane_serial_drain$VARIANT$mp + 608 18 libdispatch.dylib __dispatch_lane_invoke$VARIANT$mp + 416 19 libdispatch.dylib __dispatch_workloop_worker_thread + 588该怎么优化
最新发布
08-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值