是,工程
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface DonorTemplateClass : NSObject
- (void)testMethod:(NSString*)aStringAsParameter;
@end
@implementation DonorTemplateClass
- (void) testMethod:(NSString*)aStringAsParameter {
NSLog(@"%@ :: %@", self.class, aStringAsParameter);
}
@end
@interface AClass : NSObject
@end
@implementation AClass
@end
@interface AnotherClass : NSObject
@end
@implementation AnotherClass
@end
int main(int argc, char *argv[]) {
@autoreleasepool {
SEL justTheMethodSelector = @selector(testMethod:);
IMP justTheMethodImplementation = class_getMethodImplementation([DonorTemplateClass class], justTheMethodSelector);
AClass *anAClassInstance = [[AClass alloc] init];
AnotherClass *anotherClassInstance = [[AnotherClass alloc] init];
NSString *aString = @"Test1";
typedef void (*MyTypeName)(id,SEL, NSString*); // more info about the block syntax on http://goshdarnblocksyntax.com scroll down to "typedef"
MyTypeName blockName = (MyTypeName)justTheMethodImplementation;
blockName(anAClassInstance, justTheMethodSelector, aString);
blockName(anotherClassInstance, justTheMethodSelector, aString);
}
}
請注意,我投我的IMP到typedef定義指針類型。它編譯罰款時,我只是打電話給我,但objc_retain崩潰,然後對我來說......所以我會說你需要在使用它們之前鍵入你的IMP,但然後你可以在任何合適的類別的背景下執行它們
你究竟想在這裏完成什麼?這聽起來像是一個非常大的黑客,當實際解決方案更簡單時,這可能最終成爲一種創可貼。 –
爲了更加精確,在運行時我有一個ContextClass的實例,並且在其中一個方法中我使用了幾個塊內部的變量。我想發送這些塊(它們自動從當前範圍獲取變量引用)從它們生成IMP,然後將這些IMP從上下文實例發送到其他對象以自行執行,實質上使得對象知道其中的其他對象通過這些塊的上下文。對象應該對自身執行這個IMP,就好像我對它調用了[self anonymousMethod]一樣。讓我知道如果你有它! – unmircea