2013-01-03 31 views
0

我有一個通過FTP下載的NSMutableArray。數組中的元素是CFFTPStream resource constants,它們的類型爲CFStringRef。(Objective C)從NSMutableArray獲取CFstringRef

我想從「kCFFTPResourceName」常量創建一個字符串。然而,對於Objective C和iphone開發來說,我很困難。我已經做了

一切都導致了ARC拋出一個合適的或類似錯誤:

2013-01-03 15:31:44.874 Street Light Reporter[1382:11603] -[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x6e1e930 
2013-01-03 15:31:44.875 Street Light Reporter[1382:11603] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x6e1e930' 

我最近的嘗試是: CFStringRef * C = [AR objectAtIndex:4]。 這不工作有以下兩個原因:

Incompatible pointer types initializing 'CFStringRef *' (aka 'const struct __CFString **') with an expression of type 'id' 

Implicit conversion of an Objective-C pointer to 'CFStringRef *' (aka 'const struct __CFString **') is disallowed with ARC 

我已經試過各種類型轉換,並與(__bridge)和諸如此類的東西亂搞,我有沒有運氣。

有人可以幫我嗎?任何幫助將不勝感激。

+0

提示:向我們展示從JSON解碼器獲取的對象的源JSON字符串(至少前50個字符左右)或NSLog。 –

回答

3

這裏有兩個錯誤:第一個也是最嚴重的一個是,您的ar對象是NSDictionary而不是NSArray。這就是爲什麼執行

CFStringRef *c = [ar objectAtIndex:4]; 

你得到一個NSInvalidArgumentExceptionobjectAtIndex:是您發送到NSdictionary實例的NSArray的一種方法。

第二個錯誤是演員。正如Fernando已經指出的那樣,您需要使用__bridge關鍵字來投射它,如下所示。

CFStringRef c = (__bridge CFStringRef)([ar objectAtIndex:4]); 

使ARC會知道你現在正在治療對象作爲C指針。

還要注意CFStringRef被定義爲

typedef const struct __CFString * CFStringRef; 

所以它已經是一個指針,你必須擺脫*的。

+2

非常徹底。但是,簡單的'__bridge'不轉讓所有權;底層對象仍然由ARC管理。你需要'__bridge_retained'來承擔責任。 –

+0

@JoshCaswell你是絕對正確的。我對'__bridge_transfer'感到困惑。 –

+0

我總是感到困惑。在我評論之前,我必須先查看一下。 –

5

CFStringRef已經是指針了,你不需要這個星星。此外,您可以將CFStringRef強制轉換爲NSString,並且它可以正常工作,並且更易於使用。這被稱爲免費橋接。如果您仍然需要CFStringRef:

ARC:

CFStringRef c = (__bridge CFStringRef)([ar objectAtIndex:4]); 

非圓弧

CFStringRef c = (CFStringRef)([ar objectAtIndex:4]); 
+0

+1提及**可憐的被遺棄的非ARC解決方案** – 2013-01-03 20:52:21

+0

它編譯,但是一旦我跨過那一行,應用程序崩潰了:終止應用程序,由於未捕獲異常'NSInvalidArgumentException',原因:' - [__ NSCFDictionary objectAtIndex:]:無法識別的選擇器發送到實例0x79cd1e0'' – 0nyx

+1

那麼,這是因爲你的「ar」是一個NSDictionary而不是一個NSArray,所以你的解析有些問題,它不在你發佈的代碼 –

1

看來你得到一個CFDictionary回來,而不是一個數組。 鏈接的常量是字典的關鍵字,您可以通過它訪問這些值。