سؤال

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

وكيف يمكنني الحصول على NSString جديدة من aCFString؟

هل كانت مفيدة؟

المحلول

وNSString وCFStringRef هي "الرقم جسرا الحر"، مما يعني أنه يمكنك التلبيس ببساطة بينهما.

وعلى سبيل المثال:

CFStringRef aCFString = (CFStringRef)aNSString;

ويعمل تماما وشفافية. وبالمثل:

NSString *aNSString = (NSString *)aCFString;

وكان بناء الجملة السابقة لMRC. إذا كنت تستخدم ARC، بناء الجملة صب الجديد هو كما يلي:

NSString *aNSString = (__bridge NSString *)aCFString;

ويعمل كذلك. الشيء الرئيسي هو أن نلاحظ أن CoreFoundation وغالبا ما يعود الكائنات مع +1 حساب مرجع، وهذا يعني أنهم بحاجة إلى أن يطلق سراحه (جميع CF [نوع] إنشاء وظائف شكل تفعل ذلك).

والشيء الجميل هو أنه في الكاكاو يمكنك استخدام بأمان autorelease أو إطلاق للافراج عنها.

نصائح أخرى

إذا كنت تستخدم ARC في الإصدارات الأخيرة من نظام التشغيل Mac OS X / الهدف C، انها <ط> حقيقية من السهل:

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

ومع ذلك، فإن كسكودي تحذير لحسن الحظ كنت عند محاولة عدد جسر مجانا CFString إلى NSString وتقدم لالتفاف تلقائيا في CFBridgingRelease () الذي يمكن أن يقبل والسماح لها بإدخال المجمع بالنسبة لك تلقائيا إذا قمت بالنقر فوق الخيار.

وهي تعادل، لذلك يمكن أن يلقي فقط CFStringRef:

NSString *aNSString = (NSString*)aCFString;

لمزيد من المعلومات، انظر Toll- أنواع سد حرة .

في الواقع، يجب عدم استخدام الكاكاو الاحتفاظ بها، الإفراج عنهم، autorelease على كائنات المؤسسة الأساسية في العموميات. إذا كنت تستخدم جمع القمامة (فقط على نظام التشغيل Mac OS X حاليا)، تلك الاحتفاظ بها، الإصدار، المكالمات autorelease كلها لا مكتب خدمات المشاريع. وبالتالي تسرب الذاكرة.

HTTP: // المطور .apple.com / ماك / مكتبة / وثائق / الكاكاو / المفاهيمية / GarbageCollection / مقالات / gcCoreFoundation.html :

ومن المهم أن نقدر عدم التماثل بين مؤسسة كور والكاكاو، حيث الاحتفاظ بها، الإصدار، وautorelease توجد مكتب خدمات المشاريع. إذا، على سبيل المثال، لديك متوازنة وCFCreate ... مع الإفراج أو autorelease، سوف تسرب الكائن في بيئة القمامة التي تم جمعها:

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

وعلى العكس من ذلك، وذلك باستخدام CFRelease لاطلاق سراح الكائن الذي سبق لها الاحتفاظ باستخدام سيؤدي في إشارة العد خطأ تجاوز الحد الأدنى الاحتفاظ بها.


وPS: لا يمكن أن يبدو للتعليق على الجواب بيتر Hosey - وآسف لإضافة بلدي دون داع

.

وسأضيف التي لا يمكن إلا أن تذهب من CFString إلى NSString فقط مع نوع الصب، لكنه يعمل بطريقة أخرى أيضا. يمكنك إسقاط رسالة CFStringCreateWithCString، التي تعد واحدة أقل شيء تحتاج إلى الإفراج في وقت لاحق. (CF يستخدم Create حيث يستخدم الكاكاو alloc، وذلك في اي من الاتجاهين، وكنت قد يحتاج إلى الإفراج عنها.)

والرمز الناتج:

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

وكنت أعاني من مشكلة مع ARC والاحتفاظ عدد من CFStrings. الإجابة عن طريق NilObjects مع قرص طفيف عملت مثاليا بالنسبة لي. أنا فقط واضاف على سبيل المثال الاحتفاظ بها.

CFStringRef cfstringRef = (__bridge_retained  CFStringRef)aNsString;

وعليك أن يلقي فيه:

CFStringRef CFstringFileName=(__bridge CFStringRef)NSstringFileName;

واستخدام Youcan: مع CFStringRef آي دي سي؛

NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top