[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 ...
随机推荐
- Leap Motion发布新平台,直击下一代移动端VR/AR手部追踪
2013年,动作捕捉技术公司Leap Motion发布了面向PC的体感控制器,不过销量并不乐观.随着2014年虚拟现实技术的再一次兴起,它发布一款用于Oculus Rift的附加设备,从而正式登上VR ...
- CSS3 transform rotate(旋转)锯齿的解决办法
-moz-transform: rotate(5deg);-webkit-transform: rotate(5deg); 把图片旋转了5度.本以为轻而易举,可遇到了问题.在Fireofx中显示正常, ...
- POJ3461Oulipo 题解
题目大意: 求字符串A在字符串B中出现的次数. 思路: KMP板题,用Hash也可水过~要学习KMP可参考http://blog.csdn.net/u011564456/article/details ...
- ACM 16进制的简单运算
16进制的简单运算 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 现在给你一个16进制的加减法的表达式,要求用8进制输出表达式的结果. 输入 第一行输入一个正整 ...
- 【HDU】1846 Brave Game
http://acm.hdu.edu.cn/showproblem.php?pid=1846 题意:二人博弈,1堆石子每次取1~m个,没有石子可取的输,输出先手胜利还是后手胜利. #include & ...
- 集成IOS 环信SDK
集成IOS SDK 在您阅读此文档时,我们假定您已经具备了基础的 iOS 应用开发经验,并能够理解相关基础概念. 下载SDK 通过Cocoapods下载地址 不包含实时语音版本SDK(EaseMobC ...
- GO语言练习:第二个工程--模拟音乐播放器
1.代码 2.编译及运行 1.目录结构 1.1) $ tree . ├── mplayer.go └── src ├── mlib │ ├── manager.go │ └── manager ...
- IIS7.0+部署ARR负载均衡
安装: 1. 安装IIS(需要附带相关的健康检查,需要原始的那个默认站点) 2. 安装ARR相关的文件 3. 安装好之后,IIS里会出现有Server Farms的节点,直接创建服务器. 站点对 ...
- MAT(Memory Analyzer Tool)工具入门介绍
1.MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...
- bootstrap如何给.list-group加上序号
在bootstrap中,我们可以使用不带任何class的<ol>跟<li>来创建一个有序列表,但是如果加上list-group类,样式有了,但列表前面的数字却没了. Boots ...