2

是否可以生成 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);
}
4

1 回答 1

3

如果我们要分头发:

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

但这根本不容易。

Objective-C 可以由libclangclang (编译器所基于的 C++ 库)解析,然后使用LLVM进行 JIT 编译和运行。

这样,您可以将 clang 和 LLVM 嵌入到您的程序中,动态生成一些 Objective-C 源文本,将其解析为抽象语法树(或直接生成该 AST,无需编写和解析任何 Objective-C),然后编译它。如果您编写了一个方法来执行此操作,那么您基本上可以在应用程序中动态运行任意 Objective-C 代码。

于 2013-07-30T13:04:28.500 回答