সিএফএসস্ট্রিংআরফকে কীভাবে এনএসএস স্ট্রিংয়ে রূপান্তর করবেন?


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

কিভাবে আমি একটি নতুন পেতে পারেন NSStringথেকে aCFString?

উত্তর:


349

এনএসএসস্ট্রিং এবং সিএফএস স্ট্রিংআরফ হ'ল "টোল ফ্রি ব্রিজড", যার অর্থ আপনি কেবল তাদের মধ্যে টাইপকাস্ট করতে পারেন।

উদাহরণ স্বরূপ:

CFStringRef aCFString = (CFStringRef)aNSString;

নিখুঁত এবং স্বচ্ছভাবে কাজ করে। অনুরূপভাবে:

NSString *aNSString = (NSString *)aCFString;

আগের বাক্য গঠনটি এমআরসি-র জন্য ছিল। আপনি যদি আরসি ব্যবহার করছেন তবে নতুন ingালাই সিনট্যাক্সটি নিম্নরূপ:

NSString *aNSString = (__bridge NSString *)aCFString;

পাশাপাশি কাজ করে। মুখ্য বিষয়টি হ'ল কোরফাউন্ডেশন প্রায়শই +1 রেফারেন্স গণনা সহ বস্তুগুলিকে ফিরিয়ে দেয়, যার অর্থ তাদের মুক্তি দিতে হবে (সমস্ত সিএফ [টাইপ] ফর্ম্যাট ফাংশনগুলি এটি করে)।

সুন্দর জিনিস হ'ল কোকোতে আপনি নিরাপদে অটোরিলেজ ব্যবহার করতে পারেন বা এগুলি মুক্ত করতে মুক্তি দিতে পারেন।


88
আপনি যদি আরসি ব্যবহার করে থাকেন তবে এখন এই ক্ষেত্রে নতুন কাস্টিং সিনট্যাক্সটি হ'ল এনএসটিস্ট্রিং * aNSString = (__ ব্রিজ এনএসএসটিং *) এসিএফএসস্ট্রিং
মাইকেজি

6
ধন্যবাদ মাইকিজ, বিপরীত রূপান্তরটির জন্য আমাকে একই কাজ করতে হয়েছিল: এনএসএসটিং * টিআর = @ "এবিসি"; সিএফএসস্ট্রিংআরফ সিস্ট্রিফ = (__ সেতু সিএফএসস্ট্রিংআরএফ) str;
কমডোডেভ

2
@ নীলবজেক্ট দয়া করে আপনার উত্তরটি এআরসি অন্তর্ভুক্ত করার জন্য আপডেট করুন যাতে অনুসন্ধানকারীদের মন্তব্যগুলি পরীক্ষা করতে হবে না। ধন্যবাদ।
ড্যান রোজনস্টার্ক

17

আপনি যদি ম্যাক ওএস এক্স / অবজেক্টিভ সি এর সাম্প্রতিক সংস্করণগুলিতে এআরসি ব্যবহার করে থাকেন তবে এটি আসল সহজ:

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

যাইহোক, আপনি এনএসএসটিং-এ টোল ফ্রি ব্রিজ সিএফএসস্ট্রিংয়ের চেষ্টা করতে এবং সিএফবিডিজারিং রিলেজ () এ স্বয়ংক্রিয়ভাবে মোড়ানোর প্রস্তাব দিলে এক্সকোড আপনাকে আনন্দের সাথে সতর্ক করবে, আপনি যদি বিকল্পটি ক্লিক করেন তবে আপনি এটি স্বয়ংক্রিয়ভাবে মোড়কে sertোকাতে পারবেন।


3
আমি নিশ্চিত নই, তবে আমি মনে করি (__bridge NSString *)যথেষ্ট: রক্ষণাবেক্ষণ গণনাটি বাড়ানোর কোনও অর্থ নেই CFBridgingRelease()
সিউর


4

প্রকৃতপক্ষে, আপনার সাধারণ কোরে ফাউন্ডেশন অবজেক্টগুলিতে কোকো ধরে রাখা, প্রকাশ করা, স্বতঃসংশোধন করা উচিত নয়। যদি আপনি আবর্জনা সংগ্রহ (কেবলমাত্র ম্যাক ওএস এক্সে আপাতত ব্যবহার করছেন) ব্যবহার করেন তবে সেগুলি বজায় রাখে, ছেড়ে দেবে, অটোরেলেজ কলগুলি সবই নো-আপস। সুতরাং স্মৃতি ফাঁস।

অ্যাপল থেকে http://developer.apple.com/mac/library/docamentation/ কোকোয়া / কনসেপ্টুয়াল / গার্বেজ সংগ্রহ / আর্টিকেলস / জিসি কোর ফাউন্ডেশন এইচটিএমএল :

কোর ফাউন্ডেশন এবং কোকো-যেখানে রক্ষণাবেক্ষণ, প্রকাশ, এবং অটোরিলেজ কোনও বিকল্প নেই তার মধ্যে অসম্পূর্ণতার প্রশংসা করা গুরুত্বপূর্ণ। উদাহরণস্বরূপ, যদি আপনি কোনও সিএফসিরেটকে সামঞ্জস্য করেছেন ... রিলিজ বা অটোরিলেসের সাথে, আপনি আবর্জনা সংগৃহীত পরিবেশে এই জিনিসটি ফাঁস করবেন:

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

বিপরীতে, সিএফআলিজ ব্যবহার করে আপনি ইতিমধ্যে ধরে রাখা ব্যবহার করে ধরে রেখেছেন এমন একটি বিষয় প্রকাশ করার জন্য একটি রেফারেন্স গণনা আন্ডারফ্লো ত্রুটির ফলস্বরূপ।


পিএস: পিটার হোসেয়ের উত্তর সম্পর্কে মন্তব্য করতে পারে বলে মনে হচ্ছে না - আমার নিজের অযথা যুক্ত করার জন্য দুঃখিত।


3

আমি যুক্ত করব যে আপনি কেবল টাইপ-কাস্ট দিয়ে সিএসএসস্ট্রিং থেকে এনএসএসস্ট্রিং যেতে পারবেন না, তবে এটি অন্যভাবে কাজ করে। আপনি CFStringCreateWithCStringবার্তাটি ড্রপ করতে পারেন , এটি আপনাকে পরে প্রকাশ করতে হবে এমন একটি কম জিনিস। (সিএফ Createযেখানে কোকো ব্যবহার করে সেখানে ব্যবহার করে alloc, সুতরাং যে কোনও উপায়েই আপনাকে এটি ছেড়ে দেওয়ার দরকার পড়ে))

ফলাফল কোড:

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

2

আমি এআরসি এবং সিএফএসআরটিংসের গণনা বজায় রেখে একটি সমস্যা পেয়েছিলাম। হালকা ঝাঁকুনির সাহায্যে নিলবজেক্টস উত্তরটি আমার জন্য নিখুঁতভাবে কাজ করেছে। আমি ঠিক ধরে রাখা যেমন।

CFStringRef cfstringRef = (__bridge_retained  CFStringRef)aNsString;


-3

আপনি ব্যবহার করতে পারেন: সিএফএস স্ট্রিংআরফ আইডিসি সহ

NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.