174
NSString *aNSString;
CFStringRef aCFString;
aCFString = CFStringCreateWithCString(NULL, [aNSString UTF8String], NSUTF8StringEncoding);
aCFString = CFXMLCreateStringByUnescapingEntities(NULL, aCFString, NULL);

NSStringから新しいものを取得するにはどうすればよいaCFStringですか?

4

8 に答える 8

355

NSString と CFStringRef は「Toll free bridged」です。つまり、それらの間で単純に型キャストできます。

例えば:

CFStringRef aCFString = (CFStringRef)aNSString;

完全かつ透過的に機能します。同じく:

NSString *aNSString = (NSString *)aCFString;

以前の構文は MRC 用でした。ARC を使用している場合、新しいキャスト構文は次のようになります。

NSString *aNSString = (__bridge NSString *)aCFString;

同様に動作します。注意すべき重要な点は、CoreFoundation が +1 の参照カウントを持つオブジェクトを返すことが多いことです。つまり、解放する必要があります (すべての CF[Type]Create 形式の関数がこれを行います)。

良い点は、Cocoa では autorelease または release を安全に使用して解放できることです。

于 2009-03-12T20:37:33.023 に答える
18

Mac OS X/Objective C の最近のバージョンで ARC を使用している場合は、とても簡単です。

NSString *happyString = (NSString *)CFBridgingRelease(sadString);

ただし、CFString を NSString に無料でブリッジしようとすると、Xcode は喜んで警告を発し、それを CFBridgingRelease() で自動的にラップすることを提案します。これを受け入れて、オプションをクリックすると、ラッパーが自動的に挿入されるようにすることができます。

于 2013-03-01T01:38:46.380 に答える
12

これらは同等であるため、CFStringRef をキャストするだけです。

NSString *aNSString = (NSString*)aCFString;

詳細については、Toll-Free Bridged Typesを参照してください。

于 2009-03-12T20:37:20.917 に答える
4

実際には、一般的に Core Foundation オブジェクトに対して Cocoa の保持、解放、自動解放を使用するべきではありません。ガベージ コレクションを使用している場合 (現時点では Mac OS X のみ)、retain、release、autorelease 呼び出しはすべて no-op です。したがって、メモリリークが発生します。

Apple http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.htmlから:

Core Foundation と Cocoa の間の非対称性を理解することが重要です。保持、解放、および自動解放はノーオペレーションです。たとえば、CFCreate… と release または autorelease のバランスを取った場合、ガベージ コレクション環境でオブジェクトがリークします。

NSString *myString = (NSString *)CFStringCreate...(...);
// do interesting things with myString...
[myString release]; // leaked in a garbage collected environment

逆に、retain を使用して以前に保持したオブジェクトを CFRelease を使用して解放すると、参照カウント アンダーフロー エラーが発生します。


PS: Peter Hosey の回答にコメントできないようです。自分の回答を不必要に追加して申し訳ありません。

于 2010-04-15T22:01:16.080 に答える
2

ARC と CFStrings の保持カウントに問題がありました。少し調整してNilObjectsの回答を使用すると、私にとって完璧に機能しました。保持された例を追加しました。

CFStringRef cfstringRef = (__bridge_retained  CFStringRef)aNsString;
于 2012-07-05T22:00:09.490 に答える
0

あなたはそれをキャストする必要があります:

CFStringRef CFstringFileName=(__bridge CFStringRef)NSstringFileName;
于 2012-10-29T09:12:57.050 に答える
-3

:With CFStringRef idc; を使用できます。

NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];
于 2013-10-17T05:19:34.860 に答える