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 সৃষ্টি করতে পারে।
Read more