Runtime এর মাধ্যমে ক্লাস এবং মেথড Manipulation

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

243

Objective-C তে, runtime একটি শক্তিশালী কনসেপ্ট যা আপনার কোড চলাকালীন সময়ে ক্লাস এবং মেথডগুলিকে ডাইনামিকভাবে পরিবর্তন, এক্সিকিউট বা ম্যানিপুলেট করার অনুমতি দেয়। Objective-C Runtime ইন্টারফেস আপনাকে কোডের মধ্যে runtime পর্যায়ে ক্লাসের তথ্য, মেথড, প্রপার্টি, ইত্যাদি এক্সেস এবং ম্যানিপুলেট করার ক্ষমতা প্রদান করে। এটি সাধারণত objc/runtime.h হেডার ফাইলে পাওয়া যায়।

এখানে Objective-C Runtime এর মাধ্যমে ক্লাস এবং মেথড ম্যানিপুলেশন কিভাবে করা যায় তা নিয়ে বিস্তারিত আলোচনা করা হলো।


1. Runtime দিয়ে ক্লাস ম্যানিপুলেশন

Objective-C তে, আপনি runtime এর মাধ্যমে একটি ক্লাসের ইনস্ট্যান্স বা অবজেক্টের টাইপ, মেথড এবং প্রপার্টি গুলি ডাইনামিকভাবে এক্সেস বা পরিবর্তন করতে পারেন। ক্লাসের ডাইনামিক ম্যানিপুলেশন করার জন্য objc_getClass এবং class_getInstanceVariable এর মতো ফাংশন ব্যবহৃত হয়।

ক্লাসের ধরন পরীক্ষা করা এবং ইনস্ট্যান্স তৈরি করা

objc_getClass এর মাধ্যমে আপনি runtime সময়ে একটি ক্লাসকে খুঁজে পেতে পারেন এবং তার পর alloc এর মাধ্যমে ইনস্ট্যান্স তৈরি করতে পারেন।

#import <objc/runtime.h>
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // Runtime এ ক্লাস লোড করা
        Class carClass = objc_getClass("Car");
        
        // ক্লাসের ইনস্ট্যান্স তৈরি করা
        id myCar = [[carClass alloc] init];
        NSLog(@"Car instance created: %@", myCar);
    }
    return 0;
}

এখানে objc_getClass("Car") এর মাধ্যমে আমরা Car ক্লাসটি runtime এ এক্সেস করছি, এবং তার পর alloc করে তার একটি ইনস্ট্যান্স তৈরি করছি।


2. Runtime দিয়ে মেথড ম্যানিপুলেশন

Objective-C তে, runtime এর মাধ্যমে আপনি ক্লাসের মেথডগুলি এক্সেস, পরিবর্তন বা সরাসরি কল করতে পারেন। class_getInstanceMethod এবং method_setImplementation এর মাধ্যমে মেথডের কার্যকারিতা পরিবর্তন করা যায়। এই ধারণাটি খুবই শক্তিশালী, কারণ এর মাধ্যমে আপনি কোডের behaviour runtime পর্যায়ে পরিবর্তন করতে পারেন।

মেথড এক্সেস এবং পরিবর্তন

এখানে class_getInstanceMethod এবং method_setImplementation এর মাধ্যমে একটি মেথডের কার্যকারিতা পরিবর্তন করার উদাহরণ দেওয়া হলো।

#import <objc/runtime.h>
#import <Foundation/Foundation.h>

// Original method
@interface Car : NSObject
- (void) drive;
@end

@implementation Car
- (void) drive {
    NSLog(@"Car is driving...");
}
@end

// New method to replace the original
void customDrive(id self, SEL _cmd) {
    NSLog(@"Custom drive method called...");
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Car *myCar = [[Car alloc] init];
        
        // Get the original method (drive)
        Method originalMethod = class_getInstanceMethod([Car class], @selector(drive));
        
        // Replace the implementation with customDrive
        method_setImplementation(originalMethod, (IMP)customDrive);
        
        // Call the method after replacement
        [myCar drive];  // This will now call customDrive instead of the original drive method.
    }
    return 0;
}

এখানে:

  • class_getInstanceMethod ব্যবহার করে আমরা Car ক্লাসের drive মেথডটি এক্সেস করছি।
  • method_setImplementation ব্যবহার করে আমরা সেই মেথডের কার্যকারিতা (implementation) customDrive মেথড দিয়ে পরিবর্তন করছি।
  • পরে যখন [myCar drive] কল করা হচ্ছে, এটি নতুন customDrive মেথডটি কল করবে।

3. Runtime দিয়ে প্রপার্টি ম্যানিপুলেশন

Runtime দিয়ে প্রপার্টি ম্যানিপুলেশন করা কিছুটা জটিল হতে পারে, তবে আপনি class_getProperty এবং object_getIvar ব্যবহার করে প্রপার্টির মান পরিবর্তন করতে পারেন।

প্রপার্টি এক্সেস এবং পরিবর্তন

#import <objc/runtime.h>
#import <Foundation/Foundation.h>

@interface Car : NSObject
@property NSString *model;
@end

@implementation Car
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Car *myCar = [[Car alloc] init];
        
        // Set the 'model' property using runtime
        Ivar modelIvar = class_getInstanceVariable([Car class], "_model");
        object_setIvar(myCar, modelIvar, @"Tesla Model S");
        
        // Get the 'model' property using runtime
        NSString *carModel = object_getIvar(myCar, modelIvar);
        NSLog(@"Car Model: %@", carModel);  // Output: Tesla Model S
    }
    return 0;
}

এখানে:

  • class_getInstanceVariable ব্যবহার করে আমরা _model ইনস্ট্যান্স ভেরিয়েবলটি এক্সেস করেছি।
  • object_setIvar ব্যবহার করে আমরা myCar অবজেক্টের model প্রপার্টির মান সেট করেছি।
  • পরে object_getIvar ব্যবহার করে আমরা সেট করা মানটি পুনরায় এক্সেস করেছি।

4. Runtime ব্যবহার করার সুবিধা

  • Dynamic Behavior: Runtime এর মাধ্যমে আপনি কোডের আচরণ পরিবর্তন করতে পারেন, যা অনেক কার্যকরী যখন আপনি কোনো কোডের মেথড বা প্রপার্টির কার্যকারিতা runtime এ পরিবর্তন করতে চান।
  • Reflection: Objective-C তে runtime ব্যবহার করে আপনি ক্লাস, মেথড, এবং প্রপার্টি সম্পর্কে তথ্য জানতে পারেন, যা reflection এর মতো কাজ করে।
  • Code Flexibility: Runtime এর মাধ্যমে আপনি কোডের আচরণ আরো নমনীয় এবং ফ্লেক্সিবল করতে পারেন, যেমন ডাইনামিক মেথড কল বা কাস্টম কোড তৈরি করা।

সারাংশ

  • Runtime এর মাধ্যমে Objective-C তে class, method, এবং property গুলি dynamic ভাবে ম্যানিপুলেট করা সম্ভব।
  • objc/runtime.h এর মাধ্যমে আপনি class_getClassMethod, method_setImplementation, class_getInstanceVariable, object_setIvar ইত্যাদি ফাংশন ব্যবহার করে কোডের behaviour পরিবর্তন করতে পারেন।
  • এই টেকনিকগুলি খুবই শক্তিশালী, তবে সেগুলি সতর্কতার সাথে ব্যবহৃত হওয়া উচিত, কারণ এগুলি কোডের অন্য অংশগুলিতে unexpected results সৃষ্টি করতে পারে।
Content added By
Promotion

Are you sure to start over?

Loading...