创建NSURL的几个方法的区别

 
 
URL的基本格式 = 协议://主机地址/路径

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的几个方法的区别的更多相关文章

  1. 《Java多线程面试题》系列-创建线程的三种方法及其区别

    1. 创建线程的三种方法及其区别 1.1 继承Thread类 首先,定义Thread类的子类并重写run()方法: package com.zwwhnly.springbootaction.javab ...

  2. 创建服务factory和service方法的区别

    factory方法返回的是对象,json或数组,也可以返回字符串类型的数据,但service方法只能返回数据或对象 创建服务有3种方法 $provide.provider('服务名',function ...

  3. java中创建线程的几种方法及区别

    1,实现Runnable接口创建线程 特点: A:将代码和数据分开,形成清晰的模型 B:线程体run()方法所在的类可以从其它类中继承一些有用的属性和方法 C:有利于保持程序风格的一致性 2,继承Th ...

  4. Java中创建线程的三种方法以及区别

    Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.Java可以用三种方式来创建线程,如下所示: 1)继承Thread类创建线程 2)实现Runnable接口创建线 ...

  5. iOS @@创建NSURL的字面量

    @@ 是创建 NSURL 的字面量的绝佳方法(例如:@@"http://example.com")

  6. 第九节: 利用RemoteScheduler实现Sheduler的远程控制 第八节: Quartz.Net五大构件之SimpleThreadPool及其四种配置方案 第六节: 六类Calander处理六种不同的时间场景 第五节: Quartz.Net五大构件之Trigger的四大触发类 第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联

    第九节: 利用RemoteScheduler实现Sheduler的远程控制   一. RemoteScheduler远程控制 1. 背景: 在A服务器上部署了一个Scheduler,我们想在B服务器上 ...

  7. 22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表。然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。

    22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法sh ...

  8. 1.1-java创建包和类的方法

    1.new-package-命名方法com打头.中间名称.后台要创建的class 2.创建class-    new-class 选择一下主方法 代码示例  编译完保存一下就能输出信息,一直没有保存才 ...

  9. [转]连续创建多个Oracle触发器失败,单个创建才成功的解决方法

    连续创建多个Oracle触发器失败,单个创建才成功的解决方法   1.当我连续执行创建多个触发器时,总是报编译通过,但存在警告或错误.如下:   create or replace trigger t ...

随机推荐

  1. [转]使用EasyRsa3为OpenVPN生成密码

    1. 下载Easy RSA3 下载完并解压后,拷贝一份到/etc/openvpn和/home/client下 #.3版本需要独立下载个easy-rsa,该包用来制作ca证书,服务端证书,客户端证书 w ...

  2. maven 仓库地址:

    maven 仓库地址: 共有的仓库 http://repo1.maven.org/maven2/http://repository.jboss.com/maven2/ http://repositor ...

  3. Codeforces Round #246 (Div. 2) A. Choosing Teams

    给定n k以及n个人已参加的比赛数,让你判断最少还能参加k次比赛的队伍数,每对3人,每个人最多参加5次比赛 #include <iostream> using namespace std; ...

  4. ios cocos2d 画线出现闪烁问题

    根据http://www.merowing.info/2012/04/drawing-smooth-lines-with-cocos2d-ios-inspired-by-paper/ 用cocos2d ...

  5. 模态视图(modalTrasitionStyle)如何适应不同的版本

    随着版本的更新,模态视图对版本也有不同的要求,那如何让模态视图适应多版本的要求呢?下面是小编的个人看法! -(void)presentModalVC { modalViewController *mo ...

  6. ACM: Gym 100935G Board Game - DFS暴力搜索

    Board Game Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u  Gym 100 ...

  7. 3分钟wamp中php安装 pear 然而并没有用 并没能借此安装phpunit 不得不借用了其他的方式安装phpunit

    15:42 2015/11/233分钟wamp中php安装 pear环境介绍:windows10,wamp2.5(推荐博客的博主是win7,所以系统应该不是问题)注意:在过程中要输入一次 yes,不要 ...

  8. 【搬运工】NOIP吧置顶贴

    目的是存置顶贴里的链接.. 原帖:http://tieba.baidu.com/p/1753284199 资源站:*C++资源:http://tieba.baidu.com/p/1239792581* ...

  9. UVA 11489 - Integer Game(找规律)

    题目链接 #include <cstdio> #include <cstring> #include <string> #include <cmath> ...

  10. 修改linux运行级别

    1.Linux下的7个运行级别 0 系统停机模式,系统默认运行级别不能设置为0,否则不能正常启动,机器关闭. 1 单用户模式,root权限,用于系统维护,禁止远程登陆,就像Windows下的安全模式登 ...