天天看点

IOS使用CFURLCreateStringByAddingPercentEscapes进行URL编码

ios程序访问http资源时需要对url进行utf8编码,我在之前一直都喜欢使用nsstring的stringbyaddingpercentescapesusingencoding方法进行编码。今天在使用analyze分析工程时,提示下面的方法可能存在内存泄露:

nsstring *enstring =(nsstring *)cfurlcreatestringbyaddingpercentescapes(kcfallocatordefault, (cfstringref)stringurl, null, null, kcfstringencodingutf8);

注意到这个方法也是一个编码方案,就查询了两种方式的区别,有些收获。额外学习uitabbarcontroller隐藏tabbar以及addchildviewcontroller

stringbyaddingpercentescapesusingencoding方法有一个问题:不会转转url中的”%&?”等符号[这个很好理解,因为不好区分这些特殊字符到底是连接符号还是参数值]。这些字符在url语法中有特殊的含义,如果在url的参数中有这些字符,就需要转化为”%+ascii”的形式。如果参数中存在这些字符,而我们又使用了stringbyaddingpercentescapesusingencoding方法,则服务器会将参数中的没有转义的&当做分隔符,造成分析错误。因为我的工程中几乎没有在参数中存在%&等符号的情况,所以一直用也没问题。但咱们还是要使用正规的方式。

一般来说都是用:

1 2 3 4 5 6

cfstringref cfurlcreatestringbyaddingpercentescapes( cfallocatorref allocator, cfstringref originalstring, /*待转码的类型*/ cfstringref characterstoleaveunescaped, /*指示不转义的字符*/ cfstringref legalurlcharacterstobeescaped,/*指示确定转义的字符*/ cfstringencoding encoding); /*编码类型*/ 

方案就是单独编码参数值(如果编码整个url的话会讲url分割符&等也编码),最后拼接成完整的字符串。

示例demo如下:

1 2 3

cfstringref escaped = cfurlcreatestringbyaddingpercentescapes(null, (cfstringref)self, null, (cfstringref)@"!*'();:@&=+$,/?%#[]",kcfstringencodingutf8); nsstring *out = [nsstring stringwithstring:(nsstring *)escaped]; cfrelease(escaped);//记得释放

另外一个小知识点:

在之前做图片切割时经常用到如下代码

1 2

cgimageref newimageref = cgimagecreatewithimageinrect(sourceimageref, rect); uiimage *newimage = [uiimage imagewithcgimage:newimageref]; 

实际上这个代码会造成内存泄露,正确的方式是还需要释放newimageref,如下:

cgimageref newimageref = cgimagecreatewithimageinrect(sourceimageref, rect); uiimage *newimage = [uiimage imagewithcgimage:newimageref]; cgimagerelease(newimageref);