2013-07-30 74 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代碼。