loadবার্তা
রানটাইম loadপ্রতিটি শ্রেণীর অবজেক্টে বার্তা প্রেরণ করে , খুব শীঘ্রই প্রক্রিয়াটির ঠিকানা স্পেসে শ্রেণীর অবজেক্টটি লোড হয়। যে ক্লাসগুলি প্রোগ্রামের এক্সিকিউটেবল ফাইলের অংশ, তাদের জন্য রানটাইম loadপ্রক্রিয়াটির জীবদ্দশায় খুব শীঘ্রই বার্তাটি প্রেরণ করে । ভাগ করা (গতিশীল-লোড) লাইব্রেরিতে থাকা ক্লাসগুলির জন্য, রানটাইম ভাগ করা লাইব্রেরি প্রক্রিয়াটির ঠিকানার জায়গাতে লোড হওয়ার ঠিক পরে লোড বার্তা প্রেরণ করে।
তদুপরি, রানটাইম কেবলমাত্র loadএকটি শ্রেণীর অবজেক্টে প্রেরণ করে যদি সেই শ্রেণি অবজেক্ট নিজেই loadপদ্ধতিটি প্রয়োগ করে । উদাহরণ:
@interface Superclass : NSObject
@end
@interface Subclass : Superclass
@end
@implementation Superclass
+ (void)load {
NSLog(@"in Superclass load");
}
@end
@implementation Subclass
// ... load not implemented in this class
@end
রানটাইম ক্লাস অবজেক্টে loadবার্তা প্রেরণ করে Superclass। এটি ক্লাস অবজেক্টে বার্তাটি প্রেরণ করে না , যদিও পদ্ধতিটি উত্তরাধিকার সূত্রে প্রাপ্ত ।loadSubclassSubclassSuperclass
loadক্লাসের loadসমস্ত সুপারক্লাস অবজেক্টগুলিতে (যদি সেই সুপারক্লাস অবজেক্টগুলি বাস্তবায়িত হয় load) এবং ভাগ করা লাইব্রেরিতে আপনার লিঙ্ক করা সমস্ত শ্রেণীর অবজেক্টগুলিতে বার্তা প্রেরণের পরে রানটাইম ক্লাস অবজেক্টে বার্তা পাঠায় । কিন্তু আপনি জানেন না যে আপনার নিজস্ব নির্বাহযোগ্য অন্যান্য ক্লাসগুলি loadএখনও পেয়েছে ।
আপনার প্রক্রিয়া তার ঠিকানা জায়গাতে লোড করে এমন প্রতিটি শ্রেণি একটি loadবার্তা গ্রহণ করবে , যদি এটি loadপদ্ধতিটি প্রয়োগ করে তবে আপনার প্রক্রিয়া শ্রেণীর অন্য কোনও ব্যবহার করে কিনা তা নির্বিশেষে।
আপনি দেখতে পারেন কিভাবে রানটাইম আপ দেখায় loadএকটি বিশেষ কেস হিসাবে পদ্ধতি _class_getLoadMethodএর objc-runtime-new.mm, এবং থেকে সরাসরি এটি কল call_class_loadsমধ্যে objc-loadmethod.mm।
রানটাইম loadএকই শ্রেণীর বেশ কয়েকটি বিভাগ বাস্তবায়িত হলেও, এটি লোড হওয়া প্রতিটি বিভাগের পদ্ধতিও চালায় load। এটি অস্বাভাবিক। সাধারণত, যদি দুটি বিভাগ একই শ্রেণিতে একই পদ্ধতিটি সংজ্ঞায়িত করে, তবে একটি পদ্ধতির একটি "জয়" করবে এবং ব্যবহৃত হবে এবং অন্য পদ্ধতিটি কখনই ডাকা হবে না।
initializeপদ্ধতি
রানটাইম ক্লাস অবজেক্টে বা ক্লাসের কোনও উদাহরণে initializeপ্রথম বার্তা ( loadবা ব্যতীত initialize) প্রেরণের ঠিক আগে ক্লাস অবজেক্টে পদ্ধতিটি কল করে । এই বার্তাটি সাধারণ প্রক্রিয়া ব্যবহার করে প্রেরণ করা হয়েছে, সুতরাং যদি আপনার শ্রেণিটি প্রয়োগ না করে initializeতবে ক্লাস থেকে উত্তরাধিকার সূত্রে আসে তবে আপনার শ্রেণি তার সুপারক্লাসটি ব্যবহার করবে initialize। রানটাইম initializeক্লাসের সমস্ত সুপারক্লাসগুলিতে প্রথমে পাঠিয়ে দেবে (যদি সুপারক্লাস ইতিমধ্যে প্রেরণ করা না থাকে initialize)।
উদাহরণ:
@interface Superclass : NSObject
@end
@interface Subclass : Superclass
@end
@implementation Superclass
+ (void)initialize {
NSLog(@"in Superclass initialize; self = %@", self);
}
@end
@implementation Subclass
// ... initialize not implemented in this class
@end
int main(int argc, char *argv[]) {
@autoreleasepool {
Subclass *object = [[Subclass alloc] init];
}
return 0;
}
এই প্রোগ্রামটি আউটপুট দুটি লাইন প্রিন্ট করে:
2012-11-10 16:18:38.984 testApp[7498:c07] in Superclass initialize; self = Superclass
2012-11-10 16:18:38.987 testApp[7498:c07] in Superclass initialize; self = Subclass
যেহেতু সিস্টেমটি initializeপদ্ধতিটি অলসভাবে প্রেরণ করে , আপনার প্রোগ্রামটি প্রকৃতপক্ষে ক্লাসে (বা একটি সাবক্লাস, বা বর্গ বা উপশ্রেণীর উদাহরণ) না পাঠিয়ে একটি ক্লাস মেসেজ পাবে না। এবং আপনি গ্রহণের সময় পর্যন্ত initialize, আপনার প্রক্রিয়াটির প্রতিটি শ্রেণীর ইতিমধ্যে load(যথাযথ হলে) প্রাপ্ত হওয়া উচিত ছিল ।
বাস্তবায়নের আধ্যাত্মিক উপায় initializeহ'ল:
@implementation Someclass
+ (void)initialize {
if (self == [Someclass class]) {
// do whatever
}
}
এই প্যাটার্নটির মূল বিষয় হ'ল Someclassযখন এটির একটি সাবক্লাস রয়েছে যা বাস্তবায়ন করে না তখন নিজেকে পুনরায় আরম্ভ করা এড়ানো initialize।
রানটাইমটি initializeইন _class_initializeফাংশনে বার্তা প্রেরণ করে objc-initialize.mm। আপনি দেখতে পাচ্ছেন যে এটি objc_msgSendপ্রেরণে এটি ব্যবহার করে, এটি সাধারণ বার্তা প্রেরণার ফাংশন।
আরও পড়া
পরীক্ষা করে দেখুন মাইক অ্যাশ এর শুক্রবার Q & A- এই বিষয়ে।
+loadবিভাগগুলির জন্য পৃথকভাবে প্রেরণ করা হয়েছে; অর্থাৎ শ্রেণীর প্রতিটি বিভাগে নিজস্ব+loadপদ্ধতি থাকতে পারে ।