今天在使用URLWithString拼接NSURL的时候出现了nil: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尽量这样用:// 这样用,就不容易出现像上面的问题 NSString *urlStr = [NSString stringWithFormat:@"%@%@?%@", host_url, baseurl, postURL]; urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:urlStr]; 这样就不容易出现URLWithString拼接NSURL为nil的情况,至少我这里就不会出现了。。问题描述URLWithString:(NSString )str relativeToURL:(NSURL )baseURL中baseURL结尾字段的相关问题拼接后被去掉的问题,情况如下图:
其中“v1”拼接后就被去掉了。
解决方法
在baseURL后拼接一个空字符串,即可解决这个问题,如果baseURL本身结尾带“/”,则空字符串不产生作用;如果baseURL结尾没有“/”,则拼接完成后会在baseURL上加入“/”。
如果这时再执行URLWithStringrelativeTOURL:就不会去掉任何字段了
理解
第一种情况baseURL中的URL地址以/结尾
输出结果
第二种情况baseURL中的URL地址不以/结尾
输出结果
从以上的结果中可以看出:
只要URLWithString中的参数格式是/xx,即是以/开头的,那么输出结果就是在baseURL中的http://example.com后面直接添加URLWithString中的参数,baseURL中的xx.com后的路径参数等全部不需要了。
如果URLWithString中的参数格式不是以/开头的,那么就要看baseURL中的路径是不是以/结尾,
如果是,那么直接拼接到baseURL路径后面
如果不是,那么就需要找到baseURL路径后面倒数第一个/的位置,插入URLWithString字符串即可,即删除baseURL后面的v2
如果URLWithString是完整的网址,则直接替换URLWithString
网友评论