MacOS在启动时查找类

时间:2016-08-14 13:46:09

标签: objective-c swift macos

有没有办法确定在发布时哪些类存在?

我有一个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。

我已经读过,如果一个类没有使用它们,协议对象并不总是存在,但是这个协议被几个类使用。

任何有关如何解决这个问题的建议都会受到欢迎。

0 个答案:

没有答案