2013-07-30 34 views
2

是否有可能生成一个Obj-C方法? - 例如:生成一个Obj-C方法

- (void)doSomething:(BOOL)isLater 
{ 
    if (isLater == FALSE) 
    { 
     NSLog(@"Not Later"); 
    } else { 
     NSLog(@"Is Later"); 
    } 
} 

我专门谈论生成逻辑,我有一些代码,可以创建一个类,并添加现有的方法,但我想知道如果我能生成逻辑该方法本身并将其添加到方法?

static NSString *Description(id self, SEL _cmd) 
{ 
    return @"My Description Method"; 
} 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    Class mySubclass = objc_allocateClassPair([NSObject class], "MySubclass", 0); 

    // grab NSObject's description signature so we can borrow it 
    Method description = class_getInstanceMethod([NSObject class], 
              @selector(description)); 
    const char *types = method_getTypeEncoding(description); 

    // now add 
    class_addMethod(mySubclass, @selector(description), (IMP)Description, types); 

    objc_registerClassPair(mySubclass); 

    id myInstance = [[mySubclass alloc] init]; 
    NSLog(@"%@", myInstance); 
} 

回答

3

如果我们分裂的头发:

是的,从技术上说,你可以。

但它不会很容易。

目的-C可以通过libclang被解析并然后JIT编译和运行(其clang编译器是基于C++库)使用LLVM。通过这种方式,您可以将clang和LLVM嵌入到您的程序中,动态生成一些Objective-C源文本,将其解析为抽象语法树(或直接生成AST,无需编写和解析任何Objective-C),并编译它。如果你编写了一个这样的方法,那么你实际上可以从应用程序中动态地运行任意的Objective-C代码。