নাম দিয়ে উদ্দেশ্য-গ শ্রেণীর উদাহরণ তৈরি করুন?


95

নাম দিয়ে কোনও শ্রেণীর উদাহরণ তৈরি করা সম্ভব? কিছুটা এইরকম:

NSString* className = @"Car";
id* p = [Magic createClassByName:className];
[p turnOnEngine];

আমি জানি না উদ্দেশ্য-সিতে এটি সম্ভব কিনা তবে মনে হয় এটি হবে,

উত্তর:



38

NSClassFromString()শ্রেণীর নাম ভুল টাইপ করা বা অন্যথায় অস্তিত্ব নেই এমন একটি ক্লাস ব্যবহার করার ঝুঁকি চালায়। আপনি যদি ত্রুটিটি করেন তবে রানটাইম পর্যন্ত আপনি খুঁজে পাবেন না। পরিবর্তে, আপনি যদি Classভেরিয়েবলটি তৈরি করতে অন্তর্নির্মিত উদ্দেশ্য-সি ধরণের ব্যবহার করেন তবে সংকলকটি শ্রেণীর উপস্থিতি যাচাই করবে।

উদাহরণস্বরূপ, আপনার .h:

@property Class NameOfClass;

এবং তারপরে আপনার .m:

id object = [[NameOfClass alloc] init];

আপনি যদি শ্রেণীর নামটি ভুল টাইপ করেন বা এটি উপস্থিত না থাকে তবে আপনি সংকলনের সময় একটি ত্রুটি পাবেন। এছাড়াও আমি এই ক্লিনার কোড মনে করি।


আপনি সেখানে যান, বন্ধু। এটি পুরোপুরি নিশ্চিত নয় যে এটি সেরা উত্তর, কারণ এটিতে দুটি লাইনের প্রয়োজন এবং এটি কম গতিশীল, তবে সমস্ত একই উপায়ে আপত্তি জানায়
ক্রিস ম্যাককাল

আমি মনে করি আপনি বলতে পারেন এটি কম গতিশীল কারণ আমি স্ট্রিংয়ের পরিবর্তে একটি চিহ্ন ব্যবহার করেছি। তবে, আপনি কোডটি লেখার সময় আপনি যে ক্লাসটি চান তা যদি জানেন তবে সেক্ষেত্রে সম্ভাব্য টাইপগুলি এড়ানোর জন্য প্রতীকটি ব্যবহার করা ভাল rable
সাইমন উডসাইড

@ এসবউডসাইড: এটি কীভাবে কাজ করতে পারে? আমি এটি চেষ্টা করেছিলাম এবং আমি লিঙ্কারের কাছ থেকে "আর্কিটেকচারের জন্য অপরিবর্তিত প্রতীক" পেয়েছি।
লার্স স্নাইডার

এটিকে [[[স্ব শ্রেণি] বরাদ্দ] init] এ পরিবর্তন করুন; আপনার আর কিছু লাগবে না।
নিক টার্নার

ওপি-র ব্যবহারের ক্ষেত্রে বৈধের চেয়ে বেশি - এটি কোনও বস্তুক্রমক্রমের ক্রমিকায়নের ফাইল / মেমরি-ব্লক / প্লিস্ট / যাই হোক না কেন ফাইলের ভিত্তি। আপনি যে ক্লাসগুলি ইনস্ট্যান্ট করতে হবে তা অনেক সময় আগে থেকে আপনি জানেন না। আমার ইউজ-কেস হ'ল "রেজিস্ট্রেশন" গাজিলিয়ন "এনএসভ্যালু ট্রান্সফর্মার" এর এবং নকল করার পরিবর্তে [এনএসওয়ালিউ ট্রান্সফর্মার সেটভ্যালু ট্রান্সফর্মার: মাই ট্রান্সফর্মার বরাদ্দ] init] ফর নাম: @ "মাই ট্রান্সফর্মার"]; 40 বার - আমি কেবল একটি ট্রান্সফর্মার নামের একটি এনএসআরিকে স্ক্যান করেছি - এবং স্ট্রিং থেকে এগুলি তৈরি / নিবন্ধভুক্ত করি।
মোটি শ্নের

8

তোমাকে ছাড়া উদ্দেশ্য সি সঙ্গে কাজ করেন, তাহলে NeXTstep( OS X, iOS, GNUstepইত্যাদি) সিস্টেম বা আপনি কি চিন্তা করেন এই পদ্ধতি ক্লিনার, তাহলে আপনি কাজে লাগাতে পারে উদ্দেশ্য সি ভাষা রানটাইম লাইব্রেরির এপিআই । অধীনে Objective-C 2.0:

#import <objc/runtime.h>
//Declaration in the above named file
id objc_getClass(const char* name);
//Usage
id c = objc_getClass("Object");
[ [ c alloc ] free ];

অবজেক্টিভ-সি (১.০ বা নামবিহীন সংস্করণ) এর অধীনে আপনি নিম্নলিখিতগুলি ব্যবহার করবেন:

#import <objc/objc-api.h>
//Declaration within the above named file
Class objc_get_class( const char* name);
//Usage
Class cls = objc_get_class( "Test" );
id obj = class_create_instance( cls );
[ obj free ];

আমি 1.0সংস্করণটি পরীক্ষা করিনি, তবে আমি এখন কোডটিতে এই 2.0ফাংশনটি ব্যবহার করেছি that আমি নিজে বিশ্বাস করি ব্যবহার 2.0কার্যকারিতা উপলব্ধ ক্লিনার যদি এন ফাংশন চেয়ে হিসাবে এটি কম পরিমাণ হ্রাস করা: the length of the name in bytes + 1 ( null terminator )বনাম 2.0 API- এর জন্য the sum of two pointers (isa, cstring), একটি size_t length (cstring_length), এবং length of the string in bytes + 1জন্য NeXTSTEPAPI- টি।


2
@interface Magic : NSObject
+ (id)createInstanceOfClass:(Class)classe;
@end

@implementation Magic

+ (id)createInstanceOfClass:(Class)classe
{
    return [[classe alloc] init];
}

@end

তারপরে এটি ব্যবহার করতে:

Car *car = [Magic createInstanceOfClass:[Car class]];
[car engineTurnOn];
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.