উদ্দেশ্য-সি শ্রেণি -> স্ট্রিং এর মতো: [এনএসআরাই শ্রেণি নাম] -> @ "এনএসআরাই"


128

আমি ক্লাস অবজেক্ট থেকেই নিজের ক্লাসের স্ট্রিং নাম পাওয়ার চেষ্টা করছি।

// For instance
[NSArray className]; // @"NSArray"

আমি খুঁজে পেয়েছি object_getClassName(id obj)তবে এর জন্য একটি উদাহরণ দেওয়া দরকার এবং আমার ক্ষেত্রে এটি অনর্থক কাজ।

তাই আমি একটি বর্গ বস্তু থেকে একটি স্ট্রিং, এবং কিভাবে পেতে পারেন না একটি দৃষ্টান্ত?

উত্তর:


305
NSString *name = NSStringFromClass ([NSArray class]);

আপনি অন্য উপায়ে ফিরে যেতে পারেন:

Class arrayClass = NSClassFromString (name);
id anInstance = [[arrayClass alloc] init];

ধন্যবাদ! কীভাবে NSStringFromClassবাস্তবায়ন হয়? শ্রেণীর নামটি static NSStringভেরিয়েবলে সঞ্চয় করা কি আরও পারফরম্যান্ট ?
ma11hew28

13
@ ম্যাটডিপ্যাস্কোয়েল: সমস্ত শ্রেণীর নামগুলি উদ্দেশ্য-সি রানটাইমের কোথাও সংরক্ষণ করা হয় (রানটাইমের অভ্যন্তরগুলি বেশিরভাগ অ্যাপ্লিকেশন থেকে লুকানো থাকে এবং কেবল কয়েকটি এপিআই ফাংশনগুলির মাধ্যমে প্রকাশ করা হয়)। প্রতিটি শ্রেণীর অবজেক্ট (যেমন [NSArray class]) আসলে একটি structstructতার নাম, পদ্ধতি এটা কার্যকরী, সুপারক্লাস, ইত্যাদি সহ, বর্গ সম্পর্কে তথ্য অনেক ধারণ করে NSStringFromClassশুধু এই থেকে ক্লাসের নাম pulls structএকটি প্রয়োজন এবং এটি পরিবর্তন করে NSString। একটিতে শ্রেণীর নাম সংরক্ষণ করবেন না static NSString, এটি কোনও কার্যকারিতা সুবিধা দেয় না।
ড্রিমলাক্স

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

2
@ ম্যাটডিপিপাস্কোয়েল: "এনএসএসস্ট্রিংফ্র্যামক্লাস কীভাবে প্রয়োগ করা হয়?" আপনি যদি সত্যিই জানতে চান, এটি সম্ভবত class_getName()রানটাইমটিতে ব্যবহার করে যা কোনও সি স্ট্রিং দেয়
ব্যবহারকারী 102008

2
@ অ্যালেক্সা জাভাটোন: classNameস্ক্রিপ্টিং এক্সটেনশনগুলির দ্বারা যুক্ত একটি পদ্ধতি যা কেবলমাত্র ম্যাক ওএস এক্সে উপলভ্য, তবে এটি কীভাবে কাজ করে তা চূড়ান্ত কারণ এটি সম্পূর্ণরূপে নথিভুক্ত নয় (বা কমপক্ষে এটি চেক করার সময়টি সর্বনিম্ন ছিল না)। NSStringFromClass()এটি সম্পর্কে সঠিক উপায়।
ড্রিমল্যাক্স

1

কিছুটা কম টাইপ করে এটি করার একটি আলাদা উপায় এখানে:

NSString *name = [NSArray description];

7
যা অনুরোধ করা হয় তা করার নিশ্চয়তা নেই। এই পদ্ধতিটি সাধারণত অবজেক্টের বিবরণ এবং এতে থাকা ডেটা সরবরাহ করতে উপেক্ষা করা হয়।
অ্যালেক্স ওয়েইন

3
আমি জানি এটি একটি ইনস্ট্যান্স পদ্ধতি হিসাবে ওভাররাইড করা হয়েছে তবে + বর্ধন ক্লাস মেথোদ কতবার ওভাররাইড হয়? যে কোনও ইভেন্টে এটি প্রতিটি শ্রেণীর জন্য না থাকলে বিবেচনা করা উচিত ... আমি মনে করি না ডাউনগ্রেডের জন্য বলা হয়েছিল।
শেরউইন জাদেহ

1
@ শেরউইনজাদেহ: আমি অনুশীলন করে মনে করি, আপনি এমন ক্লাসগুলির সন্ধানের সম্ভাবনা কম পাবেন যেগুলি +descriptionতাত্ত্বিকভাবে, এটি এর উদ্দেশ্য নয় +descriptionএবং সুতরাং শ্রেণি নাম নির্ধারণের জন্য এই পদ্ধতিটি ভঙ্গুর method
ড্রিমলাক্স

1

এই বিকল্পটি বিবেচনা করুন:

const char *name = class_getName(cls);

এটি অনেক দ্রুত, যেহেতু এটি এনএসএসটিং অবজেক্ট বরাদ্দ করতে হবে না এবং যে NSStringউপস্থাপনা যা তা ASCII তে রূপান্তর করতে হবে না । এভাবেই NSStringFromClass()বাস্তবায়ন হয়।


এটি আমার জন্য দরকারী, তবে ফাইলের শীর্ষে # ইম্পোর্ট <জেজক / রানটাইম.h> যুক্ত করা দরকার।
স্পার্ক্ল্ল্লামা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.