小编Dai*_*hen的帖子

在运行时添加具有新协议的新类获得不同的行为

我在其中一个项目中发现了一个奇怪的问题.我的目标是在运行时添加一个带有新协议的新类.我拿出了部分代码来重现这个问题.

 - (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)

objective-c objective-c-runtime ios

3
推荐指数
1
解决办法
415
查看次数

标签 统计

ios ×1

objective-c ×1

objective-c-runtime ×1