Я новичок в Xcode. Я хочу знать, как я могу знать, что все классы соответствуют определенному протоколу в Xcode 4.3.1? И как я могу знать все подклассы одного класса?
Как мне получить список всех классов, соответствующих определенному протоколу в Xcode 4?
Ответ 1
Используйте Objective-C функции времени выполнения.
-
objc_getClassList
, чтобы получить списокClass
es -
class_getSuperclass
или-superclass
для перемещения цепи суперкласса -
class_conformsToProtocol
или-conformsToProtocol:
, чтобы проверить соответствие класса протоколу
Ответ 2
Protocol *protocol = @protocol(YourProtocol);
int numberOfClasses = objc_getClassList(NULL, 0);
Class *classList = malloc(numberOfClasses * sizeof(Class));
numberOfClasses = objc_getClassList(classList, numberOfClasses);
for (int idx = 0; idx < numberOfClasses; idx++)
{
Class class = classList[idx];
if (class_getClassMethod(class, @selector(conformsToProtocol:)) && [class conformsToProtocol:protocol])
{
NSLog(@"%@", NSStringFromClass(class));
}
}
free(classList);
Ответ 3
Использование ARC
int amountClasses = objc_getClassList(NULL, 0);
NSLog(@"Amount of classes: %d", amountClasses);
Class *classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * amountClasses);
amountClasses = objc_getClassList(classes, amountClasses);
for (int i = 0; i < amountClasses; i++) {
Class class = classes[i];
if ([NSBundle bundleForClass:class] != [NSBundle mainBundle]) { // restriction that pass classes from main bundle
break;
}
NSLog(@"Class name: %s", class_getName(class));
//List of all methods
unsigned int amountMethod = 0;
Method *methods = class_copyMethodList(class, &amountMethod);
for (unsigned int i = 0; i < amountMethod; i++) {
Method method = methods[i];
printf("\t method named:'%s' \n", sel_getName(method_getName(method)));
}
free(methods);
}
free(classes);