objc_msgSend এবং Method Swizzling

Objective-C Runtime (অবজেক্টিভ-সি রানটাইম) - অবজেক্টিভ-সি (Objective-C) - Computer Programming

361

objc_msgSend এবং Method Swizzling দুটি গুরুত্বপূর্ণ কনসেপ্ট Objective-C তে, যা প্রোগ্রামের চলাচল পরিবর্তন বা ডাইনামিক্যালি মেথডকে প্রভাবিত করার জন্য ব্যবহৃত হয়। এগুলি অত্যন্ত শক্তিশালী টুলস যা ডেভেলপারদের লো-লেভেল কার্যক্রম পরিচালনা করতে এবং কোডের আচরণ পরিবর্তন করতে সহায়তা করে।

এখানে, আমরা objc_msgSend এবং Method Swizzling এর ব্যবহার, তাদের উদ্দেশ্য এবং কীভাবে এগুলি কাজ করে তা বিশ্লেষণ করব।


1. objc_msgSend

objc_msgSend হল একটি ফাংশন যা Objective-C তে মেসেজ পাসিং সিস্টেমকে বাস্তবায়িত করে। এটি মূলত ডাইনামিক ডিসপ্যাচ বা মেসেজ সেন্টিং এর জন্য ব্যবহৃত হয়।

Objective-C তে, যখন একটি মেথড কল করা হয়, তখন এটি আসলে objc_msgSend ফাংশনকে কল করার মাধ্যমে বাস্তবায়িত হয়। এটি অবজেক্টের ক্লাসের সাথে সম্পর্কিত মেথডের জন্য মেসেজ পাঠায় এবং মেথড এক্সিকিউট করে।

objc_msgSend এর সাধারণ কাজ:

  1. মেসেজ পাঠানো: অবজেক্টের মেথডের নাম এবং প্যারামিটারগুলোর মাধ্যমে একটি মেসেজ পাঠানো হয়।
  2. ডাইনামিক ডিসপ্যাচ: এটি অবজেক্টের ক্লাসের সাথে সম্পর্কিত মেথড খুঁজে বের করে এবং এক্সিকিউট করে।

objc_msgSend এর উদাহরণ:

#import <objc/message.h>

@interface Person : NSObject
- (void) sayHello;
@end

@implementation Person
- (void) sayHello {
    NSLog(@"Hello from Person!");
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];
        
        // Method call using objc_msgSend
        objc_msgSend(person, @selector(sayHello));  // sayHello মেথড কল
    }
    return 0;
}

এখানে, objc_msgSend মেথডটি sayHello মেসেজটি person অবজেক্টে পাঠিয়েছে। এটি ডাইনামিক্যালি sayHello মেথড খুঁজে বের করে এবং এক্সিকিউট করে।

মুখ্য বৈশিষ্ট্য:

  • ডাইনামিক ডিসপ্যাচ: যখন একটি মেথড কল করা হয়, তখন এটি আসলে objc_msgSend এর মাধ্যমে মেসেজ পাঠিয়ে মেথডটি এক্সিকিউট হয়।
  • ডাইনামিক্যালি মেসেজ পাঠানো: মেথডের নাম এবং প্যারামিটারগুলোকে ডাইনামিক্যালি আর্গুমেন্ট হিসেবে পাস করা হয়।

2. Method Swizzling

Method Swizzling একটি ডাইনামিক কৌশল যা Objective-C তে ব্যবহার করে, যার মাধ্যমে আপনি runtime এ একটি মেথডের কার্যক্রম পরিবর্তন করতে পারেন। এটি মূলত ক্লাসের মেথডের আচরণ পরিবর্তন করার জন্য ব্যবহৃত হয়, অর্থাৎ, আপনি একটি মেথডকে অন্য একটি মেথডের সাথে সুইজ (swap) করে দিতে পারেন। এর মাধ্যমে, আপনার কোডের behavior runtime এ পরিবর্তন করা সম্ভব হয়।

Method Swizzling অনেক সময় যখন আপনি কোন নির্দিষ্ট মেথডের আচরণ পরিবর্তন করতে চান, কিন্তু আপনি ঐ মেথডের সোর্স কোড পরিবর্তন করতে পারবেন না, তখন এটি ব্যবহৃত হয়।

Method Swizzling কিভাবে কাজ করে?

  1. আপনি প্রথমে দুটি মেথড নির্বাচন করেন।
  2. এরপর, method_exchangeImplementations ফাংশন ব্যবহার করে ঐ দুটি মেথডের কার্যক্রম বদলে দেন।
  3. এর ফলে, একটি মেথডের জন্য আসলে অন্য মেথডটি কল হয়।

Method Swizzling এর উদাহরণ:

#import <objc/runtime.h>

@interface Person : NSObject
- (void) sayHello;
@end

@implementation Person

- (void) sayHello {
    NSLog(@"Hello from Person!");
}

@end

// Swizzling function to swap methods
void SwizzleMethods(Class class, SEL originalSelector, SEL swizzledSelector) {
    Method originalMethod = class_getInstanceMethod(class, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);

    // Swap the methods
    method_exchangeImplementations(originalMethod, swizzledMethod);
}

@implementation Person (Swizzling)

- (void) sayHelloSwizzled {
    NSLog(@"Swizzled Hello from Person!");
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];
        
        // Swizzling methods
        SwizzleMethods([Person class], @selector(sayHello), @selector(sayHelloSwizzled));
        
        // Now call the sayHello method
        [person sayHello];  // Output: Swizzled Hello from Person!
    }
    return 0;
}

ব্যাখ্যা:

  • sayHello মেথডটি সঠিকভাবে কাজ করে, কিন্তু আমরা এটি sayHelloSwizzled মেথডের সাথে সুইজ করে দিয়েছি।
  • method_exchangeImplementations ফাংশনটি ব্যবহার করে মেথডের কার্যক্রম পরিবর্তন করা হয়েছে। এর ফলে, যখন আমরা sayHello কল করি, তখন আসলে sayHelloSwizzled কল হয়।

Method Swizzling এর ব্যবহারিক ক্ষেত্রে:

  1. Debugging বা Logging: আপনি যখন কোনো মেথডের আগে বা পরে অতিরিক্ত লগিং বা debugging করতে চান, তখন Method Swizzling ব্যবহার করে একটি মেথডের আচরণ পরিবর্তন করতে পারেন।
  2. Third-party Libraries: কিছু থার্ড-পার্টি লাইব্রেরি যেমন CocoaPods বা Swizzle নিজেদের মেথডের আচরণ পরিবর্তন করার জন্য Swizzling ব্যবহার করে।
  3. Category ব্যবহার করে মেথড সুইজিং: Categories ব্যবহার করে আপনি একটি ক্লাসের মেথড আচরণ পরিবর্তন করতে পারেন, যেমন, কোন থার্ড-পার্টি ক্লাসের মেথডের কার্যক্রম বদলানো।

সারাংশ

  1. objc_msgSend: এটি Objective-C তে মেসেজ পাসিং সিস্টেমের মূল ফাংশন, যা ডাইনামিক ডিসপ্যাচ করতে ব্যবহৃত হয়। এটি মেথড কলের মাধ্যমে অবজেক্টের সাথে মেসেজ পাঠায় এবং সেই মেসেজের সাথে সম্পর্কিত মেথড এক্সিকিউট করে।
  2. Method Swizzling: এটি একটি ডাইনামিক কৌশল যেখানে runtime এ মেথডের কার্যক্রম পরিবর্তন করা হয়। এটি মূলত ক্লাসের মেথডের আচরণ পরিবর্তন করার জন্য ব্যবহৃত হয় এবং কখনও কখনও থার্ড-পার্টি কোড বা ডিবাগিংয়ের জন্য ব্যবহৃত হতে পারে।

Method Swizzling এবং objc_msgSend এর মাধ্যমে ডেভেলপাররা অ্যাপ্লিকেশনের আচরণ পরিবর্তন করতে এবং runtime এ মেথড কলের জন্য আরও কার্যকরী ও গতিশীল কৌশল তৈরি করতে সক্ষম হন।

Content added By
Promotion

Are you sure to start over?

Loading...