有没有办法确定在发布时哪些类存在?
我有一个Swift OS-X应用程序,它提供了一个API来添加功能。但不是动态的,一切都在发布时固定。
但是有可能找出启动时存在哪些类,然后从那里调用这些类上的某个(继承的)静态操作吗?
如果没有这种可能性,我将不得不创建一个初始化例程,每次添加新的子类时都必须更新该例程。我想避免这种情况。
澄清:我有一个协议叫它MyProtocol。在启动App时,我想在所有实现MyProtocol的类上调用MyProtocol的操作。
在检查了运行时手册之后,我得到了:
#import <Foundation/Foundation.h>
#include "Test.h"
#import <objc/objc-class.h>
void activateLaunchActions() {
// Get a list of all classes
int numClasses = 0, newNumClasses = objc_getClassList(NULL, 0);
Class *classes = NULL;
while (numClasses < newNumClasses) {
numClasses = newNumClasses;
Class newClasses[numClasses];
classes = newClasses;
newNumClasses = objc_getClassList(classes, numClasses);
}
// Get the protocol they have to confirm to
Protocol *prot = objc_getProtocol("MyProtocol");
// Get the selector to be called
SEL sel = sel_registerName("launchAction");
// Create the launchAction caller from objc_msgSend
typedef void (*send_type)(Class, SEL);
send_type callLauchAction = (send_type)objc_msgSend;
// Call the registration for all classes that confirm to the protocol
for (int i=0; i<numClasses; i++) {
if (class_conformsToProtocol(classes[i], prot)) {
callLauchAction(classes[i], sel);
}
}
}
“prot”始终为NULL。因此,测试稍后失败,并且永远不会调用launchAction。
我已经读过,如果一个类没有使用它们,协议对象并不总是存在,但是这个协议被几个类使用。
任何有关如何解决这个问题的建议都会受到欢迎。