উদ্দেশ্য গ
(সম্ভবত ম্যাক ওএস এক্সে ঝনঝনির সাথে সংকলিত হলেই)
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
void unusedFunction(void) {
printf("huh?\n");
exit(0);
}
int main() {
NSString *string;
string = (__bridge id)(void*)0x2A27; // Is this really valid?
NSLog(@"%@", [string stringByAppendingString:@"foo"]);
return 0;
}
@interface MyClass : NSObject
@end
@implementation MyClass
+ (void)load {
Class newClass = objc_allocateClassPair([NSValue class], "MyClass2", 0);
IMP imp = class_getMethodImplementation(self, @selector(unusedMethod));
class_addMethod(object_getClass(newClass), _cmd, imp, "");
objc_registerClassPair(newClass);
[newClass load];
}
- (void)unusedMethod {
Class class = [self superclass];
IMP imp = (IMP)unusedFunction;
class_addMethod(class, @selector(doesNotRecognizeSelector:), imp, "");
}
@end
এই কোডটি অব্যবহৃত ফাংশনে যেতে বিভিন্ন কৌশল ব্যবহার করে। প্রথম মান 0x2A27। এটি পূর্ণসংখ্যা 42 এর জন্য একটি ট্যাগড পয়েন্টার , যা কোনও বস্তু বরাদ্দ এড়াতে পয়েন্টারে মানটি এনকোড করে।
পরেরটি MyClass
। এটি কখনও ব্যবহার করা হয় না, তবে রানটাইমটি +load
আগে লোড হওয়ার পরে পদ্ধতিটিকে কল করে main
। এই গতিশীলভাবে এটি একটি সুপার ক্লাস NSValue
হিসাবে ব্যবহার করে একটি নতুন শ্রেণি তৈরি করে এবং নিবন্ধভুক্ত করে । এটি একটি যোগ +load
যে বর্গ জন্য পদ্ধতি ব্যবহার MyClass
এর -unusedMethod
বাস্তবায়ন হিসাবে। নিবন্ধকরণের পরে, এটি নতুন শ্রেণিতে লোড পদ্ধতিটিকে কল করে (কোনও কারণে এটি স্বয়ংক্রিয়ভাবে বলা হয় না)।
যেহেতু নতুন শ্রেণীর লোড পদ্ধতিটি একই বাস্তবায়ন ব্যবহার করে unusedMethod
, তাই কার্যকরভাবে বলা হয়। এটি নিজেই সুপারক্লাস নেয় এবং unusedFunction
শ্রেণীর doesNotRecognizeSelector:
পদ্ধতির প্রয়োগ হিসাবে এটি যুক্ত করে । এই পদ্ধতিটি মূলত একটি উদাহরণ পদ্ধতি ছিল MyClass
, তবে নতুন শ্রেণিতে শ্রেণি পদ্ধতি হিসাবে ডাকা হচ্ছে self
, নতুন শ্রেণীর অবজেক্টটিও তাই। অতএব, সুপারক্লাসটি NSValue
হ'ল এটিও সুপারক্লাস NSNumber
।
অবশেষে, main
রান। এটি পয়েন্টারের মান নেয় এবং এটিকে একটি NSString *
ভেরিয়েবলের সাথে আটকে দেয় (এটি __bridge
এবং এটির void *
সাথে বা এটি ছাড়া ব্যবহারের অনুমতি দেওয়ার জন্য প্রথম কাস্ট )। তারপরে, এটি stringByAppendingString:
সেই পরিবর্তনশীলটিকে কল করার চেষ্টা করে । যেহেতু এটি আসলে একটি সংখ্যা, যা এই পদ্ধতিটি প্রয়োগ করে না, doesNotRecognizeSelector:
পরিবর্তে পদ্ধতিটি বলা হয়, যা শ্রেণি শ্রেণিবিন্যাসের মধ্য দিয়ে ভ্রমণ করে NSValue
যেখানে এটি ব্যবহার করে প্রয়োগ করা হয় unusedFunction
।
দ্রষ্টব্য: অন্যান্য সিস্টেমের সাথে অসঙ্গতিটি ট্যাগ পয়েন্টার ব্যবহারের কারণে, যা আমি বিশ্বাস করি না যে অন্যান্য বাস্তবায়ন দ্বারা প্রয়োগ করা হয়েছে। এটি যদি একটি সাধারণভাবে তৈরি করা নম্বর দিয়ে প্রতিস্থাপন করা হয় তবে বাকী কোডটি ঠিকঠাক কাজ করা উচিত।