2011-12-20 54 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

相關問題