Objective-C Проверить, определены ли структуры

Мое приложение iOS может использовать дополнительную внешнюю стороннюю библиотеку.

Я подумал об использовании этого ответа ( Weak Linking - проверьте, существует ли класс и используйте этот класс) и определил, существует ли класс, прежде чем выполнять код, специфичный для этой библиотеки.

Однако я обнаружил, что эта внешняя библиотека написана не как классы Objective-C, а как C STRUTS и функции.

Есть ли подобный метод, который позволил бы мне проверить, существует ли C Strut или функция? Или какая-то лучшая альтернатива, чтобы увидеть, присутствует ли эта библиотека во время выполнения?

2 ответа

structs это артефакты времени компиляции. Они сообщают компилятору, как выложить область памяти. Как только это будет сделано, struct S становятся ненужными. В отличие от классов Objective C, которые имеют метаданные, structs не имеет присутствия во время выполнения. Вот почему их невозможно обнаружить во время выполнения.

Вы можете проверить наличие динамической библиотеки, вызвав dlopen и пройдя свой путь:

void *hdl = dlopen(path_to_dl, RTLD_LAZY | RTLD_LOCAL);
if (hdl == NULL) {
    // The library failed to load
    char *err = dlerror(); // Get the error message
} else {
    dlclose(hdl);
}

Если dlopen возвращается NULL библиотека не может быть загружена. Вы можете получить дополнительную информацию, позвонив по телефону dlerror, Вам нужно позвонить dlclose после того, как вы сделали.

AFAIK классическая функция С должна существовать. Он статически связан в процессе компоновки и, как и методы Objective C, не динамически связан во время выполнения.

Поэтому, когда код компилирует ссылки и без ошибок или предупреждений, то все будет в порядке.

То же самое для структур.

Другие вопросы по тегам