2011-12-20 57 views
0

我在写一个NSURL的扩展,它会给它一个方便的方法URLFromString:withArguments:,它可以构建一个包含一些参数的URL。此方法的第一个参数是一个字符串,如@"http://www.example.com/foo",第二个是NSDictionary,如{key1 => val1, key2 => val2},其中所有的键和值都是NSStrings。便利的方法将返回一个NSURL与URL一样,在这个例子中在Cocoa中对URL参数进行编码

http://www.example.com/foo?key1=val1&key2=val2 

首先,我想我应该询问是否有已经存在于基金会这样的事情!如果没有,但是,我的问题是正确编码键和值。关于这个问题已经写了很多(1,2,3)。这三种方法解决问题的方法分别是:

  1. 不雅。 (虽然它可能有效,但我还没有尝试过。)

  2. 没有正确地逃避一切。

    源代码建议在NSString上使用- stringByAddingPercentEscapesUsingEncoding来逃避一切。问题是这个方法实际上并没有逃脱它应该的一切,&符和斜杠就是两个明显的例子。我不知道这种方法何时会有用,因为这些遗漏,但它对我的应用程序肯定没有用处。

  3. 显然不是与ARC的犹太教。

    我对ARC还不是很了解,但本网站上提供的解决方案使用了ARC缓存的一些CoreFoundation类型。 Xcode提供在几个类型转换之前插入__bridge,并且代码似乎可以工作,但我不知道我是否在泄漏内存或通常做正确的事情。总的来说,在我看来,我不应该这么低级。

所以再次,我的问题是:有没有办法做内置到NSURL或NSString或类似的HTTP请求所需的百分比编码?如果不是,最安全的方法是什么?

回答

1

使用(3)。 ARC不直接处理CF类型,就像垃圾收集不是直接处理CF类型一样,桥梁转换只是指示ARC从CF中为对象承担责任(因为NSMakeCollectible针对GC)。放在正确的桥梁投下,你不会泄漏任何内存,请参阅section 3.2.4 in the ARC docs

+0

谢谢。与此同时,我在同一主题上找到了[这个SO问题](http://stackoverflow.com/questions/6822473/correct-bridging-for-arc)。所以如果我拿ARC代码的例子,并删除第一个'__autoreleasing'我会好吗? – bdesham 2011-12-20 15:41:13

+1

是的(以及一些随机文本以符合最小注释长度:-)) – CRD 2011-12-20 16:32:02