Skip to content

Instantly share code, notes, and snippets.

@Tricertops
Created March 24, 2014 11:23
Show Gist options
  • Select an option

  • Save Tricertops/9738484 to your computer and use it in GitHub Desktop.

Select an option

Save Tricertops/9738484 to your computer and use it in GitHub Desktop.
Runtime @protocol introspection
+ (void)enumerateAdoptedProtocolsOfProtocol:(Protocol *)protocol usingBlock:(void(^)(Protocol *adoptedProtocol))block {
unsigned int adoptedCount = 0;
Protocol * __unsafe_unretained *adoptedProtocolList = protocol_copyProtocolList(protocol, &adoptedCount);
if (adoptedProtocolList) {
for (NSUInteger index = 0; index < adoptedCount; index++) {
Protocol *adoptedProtocol = adoptedProtocolList[index];
block(adoptedProtocol);
}
free(adoptedProtocolList);
}
}
+ (void)enumerateMethodsInProtocol:(Protocol *)protocol
required:(BOOL)onlyRequired
instance:(BOOL)onlyInstance
usingBlock:(void(^)(SEL selector, NSMethodSignature *signature))block {
unsigned int methodCount = 0;
struct objc_method_description *methods = protocol_copyMethodDescriptionList(protocol, onlyRequired, onlyInstance, &methodCount);
if (methods) {
for (NSUInteger index = 0; index < methodCount; index++) {
struct objc_method_description method = methods[index];
NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:method.types];
block(method.name, signature);
}
free(methods);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment