如何在Objective-C中在运行时创建协议?

Jar*_*tar 3 protocols objective-c objective-c-runtime

首先,我想明确我不是在谈论定义一个协议,而是我理解它的概念

@protocol someprotocol
- (void)method;
@end
Run Code Online (Sandbox Code Playgroud)

我知道Obj-C运行时允许在RUNTIME中创建类,以及它的ivars和方法.也可用于创建SEL-s.我想我只是遗漏了一些东西,但有没有人知道在运行时调用什么函数来创建协议?这个的主要原因是conformsToProtocol:工作,所以只是添加适当的方法并没有真正削减它.

Exp*_*ing 8

在运行时添加协议的方法

Protocol *aProtocol = objc_allocateProtocol("TestingRuntimeDelegate");
AppDelegate *appInstance = (AppDelegate*)[[UIApplication sharedApplication] delegate];
NSLog(@"conformed Protocol ..%d",class_conformsToProtocol([self.delegate class], aProtocol));

protocol_addMethodDescription(aProtocol, @selector(itIsTestDelegate), "test", NO, NO);
objc_registerProtocol(aProtocol);
class_addProtocol([appInstance class], aProtocol);
//NSLog(@"adding Protocol %d",class_addProtocol([appInstance class], aProtocol));

if ([self.delegate conformsToProtocol:@protocol(TestDelegate)])
{
    NSLog(@"conformed Protocol ..");
}
else
{
    NSLog(@"conformed Protocol ..%d",class_conformsToProtocol([appInstance class], aProtocol));
    class_conformsToProtocol([self.delegate class], aProtocol);
    [appInstance performSelector:@selector(itIsTestDelegate)];
}
Run Code Online (Sandbox Code Playgroud)

但是委托方法必须先在该类上定义,否则会由于无法识别的选择器而崩溃

或者可以在运行时添加方法..然后它会正常工作..

但必须先导入以下文件.

#include <objc/runtime.h>
Run Code Online (Sandbox Code Playgroud)