[BS-27] 创建NSURL的几个方法的区别
创建NSURL的几个方法的区别
URL和Path的区别
* URL:统一资源定位符,格式 “协议+主机名称+路径” 例如:[NSURL URLWithString:@"http://www.baidu.com"];
本地文件URL字符串格式 file:///Users/wz/Desktop/main.c //本地文件主机地址是localhost,可以省略,故有3个/
* Path:就是简单的路径,没有协议,没有主机地址 例如: Users/wz/Desktop/main.c
NSString *path = [[NSBundle mainBundle] pathForResource:@"buyao.wav" ofType:nil]; //发送网络请求一般用第1种
//NSURL *url1 = [NSURL URLWithString:@“http://www.baidu.com”];
NSURL *url1 = [NSURL URLWithString:[path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];//有问题,打印中间有省略号 //获取本地文件URL一般用2,3两种方法
NSURL *url2 = [NSURL fileURLWithPath:path];
NSURL *url3 = [[NSBundle mainBundle] URLForResource:@"buyao.wav" withExtension:nil]; NSLog(@"\n%@,\n%@,\n%@,\n%@",path,url1,url2,url3); //打印结果:
/Users/wz/Library/Developer/CoreSimulator/Devices/879D7E35-BE50--97E1-D1023FE13CEA/data/Containers/Bundle/Application/E9404FC7-DC64-42A0-B445-34D61480D620/音效、音乐、流媒体音乐播放.app/buyao.wav, /Users/wz/Library/Developer/CoreSimulator/Devices/879D7E35-BE50--97E1-D1023FE13CEA/data/Containers/Bundle/Appl ... uyao.wav, file:///Users/wz/Library/Developer/CoreSimulator/Devices/879D7E35-BE50-4620-97E1-D1023FE13CEA/data/Containers/Bundle/Application/E9404FC7-DC64-42A0-B445-34D61480D620/%E9%9F%B3%E6%95%88%E3%80%81%E9%9F%B3%E4%B9%90%E3%80%81%E6%B5%81%E5%AA%92%E4%BD%93%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE.app/buyao.wav, file:///Users/wz/Library/Developer/CoreSimulator/Devices/879D7E35-BE50-4620-97E1-D1023FE13CEA/data/Containers/Bundle/Application/E9404FC7-DC64-42A0-B445-34D61480D620/%E9%9F%B3%E6%95%88%E3%80%81%E9%9F%B3%E4%B9%90%E3%80%81%E6%B5%81%E5%AA%92%E4%BD%93%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE.app/buyao.wav
iOS开发,NSURL后面跟的字符串可以是随便网址的字符串吗?是不是上个网站把地址粘贴上去就行?
NSURL *URL = [NSURL URLWithString:@"http://www.baidu.com"];
如果你的URL中有中文或者不合法的字符,那么以上方法返回的URL就会为nil。只有在格式规范的条件下才会创建一个有效的NSURL类型。
原因参见官方文档:
Parameters
This method expects URLString to contain any necessary percent escape codes, which are ‘:’, ‘/’, ‘%’, ‘#’, ‘;’, and ‘@’. Note that ‘%’ escapes are translated via UTF-8. The URL string with which to initialize the NSURL object. Must be a URL that conforms to RFC 2396. This method parses URLString according to RFCs 1738 and 1808. 文档里提到string 的格式必须复合RFC 2396,解析按照RFC 1738和1808来进行解析。
Return Value
An NSURL object initialized with URLString. If the URL string was malformed or nil, returns nil.
//不合法的URL
NSURL *url = [NSURL URLWithString:@"http://192.168.0.118:8080/homelife/mobile/??estate!loadPropertyPhone.action?propertyCompanyId=3"];
//对其进行转码后,就OK了
NSURL *url = [NSURL URLWithString:[@"http://192.168.0.118:8080/homelife/mobile/estate!loadPropertyPhone.action?propertyCompanyId=3" stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding] ];
关于NSURL的使用注意事项:
1、 [NSURL URLWithString:urlString],urlString的类型必须正确,必须以http或者https开头,在一次项目中因为在http前面多了个空格,导致字符串转化为NSURL类型时为空。
2、在使用ASI发送请求时,相同信息可以放在http头部统一处理,这样就可以在每次请求中加入相同的参数
3、使用 [NSURL URLWithString:urlString]导致返回的url为nil,因为Return Value
An NSURL object initialized with URLString. If the string was malformed, returns nil.
Discussion
This method expects URLString to contain any necessary percent escape codes, which are ‘:’, ‘/’, ‘%’, ‘#’, ‘;’, and ‘@’. Note that ‘%’ escapes are translated via UTF-8.
所以使用
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
通过utf-8编码,来规避一些特殊字符
url = [NSURL URLWithString:urlStr];
4.如果加载本地的文件,尽量使用 url = [NSURL fileURLWithPath:path]; 该方法会自动对path中的汉字进行转码。
file:///Users/wz/Library/Developer/CoreSimulator/Devices/879D7E35-BE50-4620-97E1-D1023FE13CEA/data/Containers/Bundle/Application/5535F35E-0714-4A6F-8FE8-86C67FF594DA/%E9%9F%B3%E6%95%88%E3%80%81%E9%9F%B3%E4%B9%90%E3%80%81%E6%B5%81%E5%AA%92%E4%BD%93%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE.app/buyao.wav,
[BS-27] 创建NSURL的几个方法的区别的更多相关文章
- 《Java多线程面试题》系列-创建线程的三种方法及其区别
1. 创建线程的三种方法及其区别 1.1 继承Thread类 首先,定义Thread类的子类并重写run()方法: package com.zwwhnly.springbootaction.javab ...
- 创建服务factory和service方法的区别
factory方法返回的是对象,json或数组,也可以返回字符串类型的数据,但service方法只能返回数据或对象 创建服务有3种方法 $provide.provider('服务名',function ...
- java中创建线程的几种方法及区别
1,实现Runnable接口创建线程 特点: A:将代码和数据分开,形成清晰的模型 B:线程体run()方法所在的类可以从其它类中继承一些有用的属性和方法 C:有利于保持程序风格的一致性 2,继承Th ...
- Java中创建线程的三种方法以及区别
Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.Java可以用三种方式来创建线程,如下所示: 1)继承Thread类创建线程 2)实现Runnable接口创建线 ...
- iOS @@创建NSURL的字面量
@@ 是创建 NSURL 的字面量的绝佳方法(例如:@@"http://example.com")
- 第九节: 利用RemoteScheduler实现Sheduler的远程控制 第八节: Quartz.Net五大构件之SimpleThreadPool及其四种配置方案 第六节: 六类Calander处理六种不同的时间场景 第五节: Quartz.Net五大构件之Trigger的四大触发类 第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联
第九节: 利用RemoteScheduler实现Sheduler的远程控制 一. RemoteScheduler远程控制 1. 背景: 在A服务器上部署了一个Scheduler,我们想在B服务器上 ...
- 22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表。然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。
22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法sh ...
- 1.1-java创建包和类的方法
1.new-package-命名方法com打头.中间名称.后台要创建的class 2.创建class- new-class 选择一下主方法 代码示例 编译完保存一下就能输出信息,一直没有保存才 ...
- [转]连续创建多个Oracle触发器失败,单个创建才成功的解决方法
连续创建多个Oracle触发器失败,单个创建才成功的解决方法 1.当我连续执行创建多个触发器时,总是报编译通过,但存在警告或错误.如下: create or replace trigger t ...
随机推荐
- Ubuntu下SVN配置
今天上午写了一个脚本,然后想起来现在写的R脚本,常常在分析过程中就直接改掉了.隐隐还是觉得存在隐患,想着svn部署应该不会太难,于是就直接动手干了. 弄了一上午的时间,感觉还是花了点时间. 这里有篇b ...
- AngularJS学习笔记之directive—scope选项与绑定策略
From:http://www.linuxidc.com/Linux/2015-05/116924.htm scope:{}使指令与外界隔离开来,使其模板(template)处于non-inherit ...
- git的几种回滚 git revert 和 git reset的区别
git的几种回滚 git revert 和 git reset的区别:强烈建议:对HEAD不熟的话最好不要用HEAD,直接用commitID吧,我遇到的问题:reset HEAD~1之后,可能是别人提 ...
- 【BZOJ】1105: [POI2007]石头花园SKA
题意 二维平面上有\(n(2 \le n \le 1000000)\)个点,可以花费\(w_i\)交换第\(i\)个点的横纵坐标.求在满足能覆盖所有点的最小矩阵周长最短的情况下花费最小. 分析 这题太 ...
- 【noiOJ】p8208
03:切分矩形组 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 给定若干个平行于坐标轴的互不重叠的矩形,矩形的顶点都是整点.要求画一根平行于y轴的直线x=k ...
- IOS 登陆判断问题
有一个登陆界面,还有一个包含多个选项卡的界面在ViewController.m中登陆按钮的代码如下 UIViewController *controller=[[Tabbarcontroller al ...
- POJ3903:Stock Exchange(LIS)
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87125#problem/E 题目: Description The world ...
- 用clip剪裁实现半圆
定义和用法 clip 属性剪裁绝对定位元素. 说明 这个属性用于定义一个剪裁矩形.对于一个绝对定义元素,在这个矩形内的内容才可见.出了这个剪裁区域的内容会根据 overflow 的值来处理.剪裁区域可 ...
- 四种读写方案IO流 (JAVA)
File类用于访问文件或目录的属性 流:指一连串流动的字符,是以先进先出的方式发送信息的通道.程序和数据源之间是通过流联系起来的. 第一套:字节流读取写入方案 FileInputStream :字节流 ...
- winform记事本初步实现
public Form1() { InitializeComponent(); } private void 剪切TToolStripMenuItem_Click(object sender, Eve ...