Yanıtlar:
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.
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.
(__bridge NSString *)
yeterli: alıkoyma sayısını arttırmanın bir anlamı yok CFBridgingRelease()
.
Eşdeğerdirler, böylece CFStringRef'i yayınlayabilirsiniz:
NSString *aNSString = (NSString*)aCFString;
Daha fazla bilgi için, Ücretsiz Köprülü Tipler'e bakınız .
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.
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.
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. CFStringCreateWithCString
Daha sonra bırakmanız gereken daha az şey olan iletiyi bırakabilirsiniz . (CF, Cocoa'nın kullandığı Create
yerleri 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];
Kullanım: CFStringRef idc ile;
NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];