【发布时间】:2018-01-01 15:04:06
【问题描述】:
我是第一次尝试 Objective-C 运行时方法。我一直在阅读 iOS 7 编程中的一章(24 章),突破极限。根据书中的示例,我实现了一个消息调度程序功能,如下所示:
static const void *myMsgSend(id receiver, const char *name) {
SEL selector = sel_registerName(name);
Class receiverClass = object_getClass(receiver);
IMP methodIMP = class_getMethodImplementation(receiverClass, selector);
return CFBridgingRetain(methodIMP(receiver, selector));
}
我在下面的函数中测试了这个调度器:
void runMyMsgSend() {
// NSObject *object = [[NSObject alloc] init];
Class class = (Class)objc_getClass("NSObject");
id object = class_createInstance(class, 0);
myMsgSend(object, "init");
// id description = [object description];
id description = (__bridge id)myMsgSend(object, "description");
// const char *cstr = [description UTF8String];
const char *cstr = myMsgSend(description, "UTF8String");
printf("---------------------");
printf("%s\n", cstr);
}
该函数适用于 init 和 description 类型为 NSObject 的对象实例。 当在 description 指向的对象上调用调度程序函数时,使用 UTF8String 作为运行方法,它会在
上崩溃return CFBridgingRetain(methodIMP(receiver, selector));
现在我知道 NSString 是一个集群,实际上使用了一个 __NSCFString 的对象。我认为这可能是调用 CFBridgingRetain 时的问题。我需要更好地了解实际导致崩溃的原因。提前致谢。
【问题讨论】:
标签: ios objective-c objective-c-runtime