[BS-27] 创建NSURL的几个方法的区别

创建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-4620-97E1-D1023FE13CEA/data/Containers/Bundle/Application/E9404FC7-DC64-42A0-B445-34D61480D620/音效、音乐、流媒体音乐播放.app/buyao.wav,

/Users/wz/Library/Developer/CoreSimulator/Devices/879D7E35-BE50-4620-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,

时间: 2024-09-29 04:27:33

[BS-27] 创建NSURL的几个方法的区别的相关文章

java中创建线程的三种方法以及区别

Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.Java可以用三种方式来创建线程,如下所示: 1)继承Thread类创建线程 2)实现Runnable接口创建线程 3)使用Callable和Future创建线程 下面让我们分别来看看这三种创建线程的方法. ------------------------继承Thread类创建线程--------------------- 通过继承Thread类来创建并启动多线程的一般步骤如下 1]d定义Thread类的子类

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

factory方法返回的是对象,json或数组,而service方法返回的是字符串类型的数据 angular.module('myApp',[]).factory('服务名',function(){ return {uname:'kevin',pwd:'123'} }).controller('ctrlname',function('服务名',$scope){ }.directive('myDirective', function(){ return { template: '<button>

两种在linux下创建应用程序快捷方式的方法

两种在linux下创建应用程序快捷方式的方法: A. 在桌面上创建快捷方式 B. 在应用程序菜单中添加快捷方式 在桌面上创建快捷方式 这是最简单的一种方法,在桌面上单击鼠标右键,会有一个“创建启动器”栏.这里我以为mplayer创建快捷方式为例说明: 名称-mplayer(或者你喜欢的任何名称,这个名称会出现在快捷图标的 下方) 命令-/usr/bin/gmplayer(这个是mplayer的gui应用程序的执行文件,跟 安装路径相关,可以通过which gmplayer找到) 图标-一般应用程

创建线程的两种方法

第一种:继承Thread类 子类覆写父类的run方法,将线程代码写在run()中. 建立子类对象,些时线程也被创建了. 通过start方法启动线程. 第二种:实现Runnable接口 子类覆盖接口的run方法,将线程代码写在run()中. 通过Thread类创建线程,并将实现Runnable接口的子类对象作为参数传递给Thread类的构造函数. Thread对象调用start方法启动线程. 两者的比较: 继承Thread类,相对简单,但因为单继承的局限性,同份资源不共享,而不建议使用:而实现Ru

Javascript使用function创建类的两种方法

1.使用function类 //myFunction.js var CMyFunc=function() { //类的公共方法,供外部调用 this.Func1=function() { var i=0; return i; } this.Func2=function() { _privateFunc(); } //类中的私有方法,供公共方法调用 function _privateFunc() { return 0; ] } CMyFunc myFunc=new CMyFunc(); 使用:其它

fork同时创建多个子进程的方法

Fork同时创建多个子进程方法 第一种方法:验证通过 特点:同时创建多个子进程,每个子进程可以执行不同的任务,程序 可读性较好,便于分析,易扩展为多个子进程 int main(void) { printf("before fork(), pid = %d\n", getpid()); pid_t p1 = fork(); if( p1 == 0 ) { printf("in child 1, pid = %d\n", getpid()); return 0; //若

使用express创建node服务器的两种方法及区别

使用express创建node服务器有两种方法,如下所示: 方法一: var express = require('express'); var app = express(); app.listen('3000', function () { console.log("The server is running at *: 3000"); }); 这是我们常用的一种创建node服务器的方式. 写vue项目时使用的vue-cli脚手架使用的就是这种创建方式.  方法二: var exp

1.1-java创建包和类的方法

1.new-package-命名方法com打头.中间名称.后台要创建的class 2.创建class-    new-class 选择一下主方法 代码示例  编译完保存一下就能输出信息,一直没有保存才会输出不了 package com.chongrui.test; public class test { public static void main(String[] args){ byte mybyte=124; short myshort= 32564; int myint =4578461

动态创建标记的三种方法

动态创建标记: 1.document.write() 可以直接把字符串插入文档中,最大的缺点是它违背了“行为应该与表现分离”的原则.避免使用document.write()方法. 2.innerHtml属性: innerHtml属性可以用来读.写某给定元素的html内容,是HTML的专有属性. 3.DOM方法: (1)创建新的元素:createElement()方法: (2)把新创建的节点插入某个文档的节点树:appendChild()方法: (3)创建文本结点:createTextNode()