我在其中一个项目中发现了一个奇怪的问题.我的目标是在运行时添加一个带有新协议的新类.我拿出了部分代码来重现这个问题.
- (void)viewDidLoad {
[super viewDidLoad];
[self registerClass:@"Daidouji"];
[self protocolInClass:NSClassFromString(@"Daidouji")];
}
- (void)registerClass:(NSString *)className {
Class superclass = (Class)objc_getClass("UIViewController");
Class newClass = objc_allocateClassPair(superclass, [className UTF8String], 0);
Protocol *newProtocol = objc_allocateProtocol([@"ViewController" UTF8String]);
objc_registerProtocol(newProtocol);
class_addProtocol(newClass, newProtocol);
objc_registerClassPair(newClass);
}
- (void)protocolInClass:(Class)cls {
unsigned count;
__unsafe_unretained Protocol **protocols = class_copyProtocolList(cls, &count);
if (count) {
NSLog(@"%@", [NSString stringWithUTF8String:protocol_getName(protocols[0])]);
}
free(protocols);
}
Run Code Online (Sandbox Code Playgroud)
在iPhone5(armv7)或iOS模拟器(i386/x86_64)中,NSLog可以很好地打印ViewController.在iPhone5s(arm64)中,应用程序将崩溃或打印(null).
我发现的第一个解决方案是添加protocol_getName之类的
- (void)registerClass:(NSString *)className {
Class superclass = (Class)objc_getClass("UIViewController");
Class newClass = objc_allocateClassPair(superclass, [className UTF8String], 0);
Protocol …Run Code Online (Sandbox Code Playgroud)