Nasıl CFStringRef NSString dönüştürmek için?


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

Nasıl yeni alabilirim NSStringdan aCFString?

Yanıtlar:


349

NSString ve CFStringRef "Ücretsiz köprülü" dir, yani aralarında basitçe tahmin yapabilirsiniz.

Örneğin:

CFStringRef aCFString = (CFStringRef)aNSString;

mükemmel ve şeffaf çalışır. Aynı şekilde:

NSString *aNSString = (NSString *)aCFString;

Önceki sözdizimi MRC içindi. ARC kullanıyorsanız, yeni döküm sözdizimi aşağıdaki gibidir:

NSString *aNSString = (__bridge NSString *)aCFString;

çalışır. Dikkat edilmesi gereken önemli nokta, CoreFoundation'ın genellikle +1 referans sayısı olan nesneleri döndürmesi, yani serbest bırakılması gerektiği anlamına gelir (tüm CF [Type] Create format işlevleri bunu yapar).

Güzel olan şey, Cocoa'da otomatik olarak serbest bırakma veya serbest bırakmak için serbest bırakabilmenizdir.


88
Eğer ARC kullanıyorsanız, bu durum için yeni döküm sözdizimi şimdi * aNSString = (__bridge NSString *) aCFString NSString olduğunu
MikeG

6
Teşekkürler MikeG, ters dönüşüm için benzer yapmak zorunda kaldı: NSString * str = @ "abc"; CFStringRef cstrref = (__ köprüsü CFStringRef) str;
KomodoDave

2
@NilObject lütfen yanıtınızı ARC'yi içerecek şekilde güncelleyin, böylece arama yapanların yorumları kontrol etmesi gerekmez. Teşekkürler.
Dan Rosenstark

17

ARC'yi Mac OS X / Objective C'nin son sürümlerinde kullanıyorsanız, gerçekten kolay:

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

Bununla birlikte, Xcode, ücretsiz köprü CFString'i NSString'e ödemeye çalıştığınızda ve seçeneği tıklarsanız, sarmalayıcıyı sizin için otomatik olarak eklemesini sağlayabileceğiniz CFBridgingRelease () 'e otomatik olarak sarmayı önerdiğinizde sizi mutlu edecektir.


3
Emin değilim, ama bence (__bridge NSString *)yeterli: alıkoyma sayısını arttırmanın bir anlamı yok CFBridgingRelease().
Cœur


4

Aslında, genel olarak Core Foundation nesnelerinde Kakao alıkoyma, bırakma, otomatik yayınlama kullanmamalısınız. Garbage Collection kullanıyorsanız (şimdilik sadece Mac OS X'te), bu tutma, bırakma, otomatik serbest bırakma çağrılarının tümü işlem yapılmaz. Böylece bellek sızıntısı oluyor.

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

Korunması, serbest bırakılması ve otomatik çalıştırmanın işlem yapmadığı Çekirdek Vakfı ve Kakao arasındaki asimetriyi takdir etmek önemlidir. Örneğin, bir CFCreate… öğesini serbest bırakma veya otomatik kiralama ile dengelediyseniz, nesneyi çöp toplanan bir ortamda sızdırırsınız:

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

Bunun tersine, daha önce alıkoyma özelliğini kullanarak sakladığınız bir nesneyi serbest bırakmak için CFRelease kullanmak bir referans sayımı düşük akış hatasına neden olur.


Not: Peter Hosey'in cevabı hakkında yorum yapamıyor gibi görünüyor - gereksiz yere kendi cevabımı eklediğim için üzgünüm.


3

Sadece CFString'den NSString'e sadece bir tür dökümle gidebileceğinizi değil, aynı zamanda başka şekilde de çalışacağını ekleyeceğim. CFStringCreateWithCStringDaha sonra bırakmanız gereken daha az şey olan iletiyi bırakabilirsiniz . (CF, Cocoa'nın kullandığı Createyerleri kullanıralloc , bu nedenle her iki şekilde de serbest bırakmanız gerekir.)

Ortaya çıkan kod:

NSString *escapedString;
NSString *unescapedString = [(NSString *) CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef) escapedString, NULL) autorelease];

2

ARC ve CFStrings'in elde tutulmasıyla ilgili bir sorunum vardı. NilObjects'in cevaplarını hafif bir tweak ile kullanmak benim için mükemmel çalıştı. Ben sadece eklenmiş olarak ekledi.

CFStringRef cfstringRef = (__bridge_retained  CFStringRef)aNsString;

0

Yapmanız gerekenler:

CFStringRef CFstringFileName=(__bridge CFStringRef)NSstringFileName;

-3

Kullanım: CFStringRef idc ile;

NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.