在Objective-C中动态添加方法到对象?

dev*_*os1 0 reflection dynamic objective-c

我想在Objective-C中执行此JavaScript:

var obj = {};
obj.myFunc = function() { ... };
Run Code Online (Sandbox Code Playgroud)

这可能吗?或者只能将方法添加到Objective-C中的而不是对象?即我发现class_addMethod,但我想要一种方法在同一个类的不同实例上使用相同选择器的不同实现.

这可能还是我SOL?

rob*_*off 5

在Objective-C中,方法(甚至实例方法)仅在类上定义,而不是在单个对象上定义.

您可以在运行时使用objc_allocateClassPair并向该类添加方法来创建新类.您可以使用在运行时更改对象的类object_setClass.如果你决定调查一下,你会想要对"isa-swizzling"做一些研究.如果你想在你也将与KVO一起使用的对象上使用它,这尤其成问题.

如果您只需更改API以使用块,那将更加简单.例:

@interface MyObject : NSObject

- (void)myMethodWithString:(NSString *)string;

typedef void (^MyMethodBlock)(NSString *string);

@property (nonatomic, copy) MyMethodBlock myMethodBlock;

@end

@implementation MyObject

@synthesize myMethodBlock = _myMethodBlock;

- (void)myMethodWithString:(NSString *)string {
    MyMethodBlock block = self.myMethodBlock;
    if (block) {
        block(string);
    }
}

@end
Run Code Online (Sandbox Code Playgroud)