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:工作,所以只是添加适当的方法并没有真正削减它.
在运行时添加协议的方法
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)
归档时间: |
|
查看次数: |
3264 次 |
最近记录: |