Как условно использовать статическую библиотеку только при наличии ссылки - PullRequest
2 голосов
/ 29 октября 2010

Я делаю проект плагина для iPhone, где я создаю статическую библиотеку, назовем ее lib1.a, которую я предоставляю другим программистам.

Когда они связывают lib1.a со своим проектом, они могуттакже ссылка на lib2.a, которую они сами создают на основе заголовочного файла, который я им предоставляю.Этот заголовок содержит только функцию «hook», которая создает экземпляр объекта obj-c.

Это все работает нормально, но я бы хотел, чтобы проект, связывающий lib1.a, а не , должен был ссылка lib2.a.Имейте в виду, что iOS поддерживает только статические библиотеки, и я не хочу предоставлять несколько версий lib1.a.

Ответы [ 3 ]

3 голосов
/ 01 ноября 2010

Спасибо, Крис.Я закончил с чем-то похожим: необязательный lib2.a содержит фабричный класс, который создает объект, который реализует определенный протокол, который предоставляет дополнительные функциональные возможности.Это заголовок:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@protocol OptionalStuffDelegate

// Delegate methods here

@end

@protocol OptionalStuff

// Methods here

@end

@interface OptionalStuffFactory : NSObject {}

+ (id<OptionalStuff>)instantiateWithDelegate:(id <OptionalStuffDelegate>)delegate baseView:(UIView *)baseView;

@end

Чтобы создать экземпляр в lib1.a, я делаю:

Class optionalStuffFactoryClass = NSClassFromString(@"OptionalStuffFactory");

if (optionalStuffFactoryClass != nil)
{
    optionalStuff = [optionalStuffFactoryClass performSelector: @selector(instantiateWithDelegate:baseView:) withObject: self withObject: glView];
}

lib2.a реализует класс фабрики.Тот факт, что во время компиляции нет никаких ссылок на класс OptionalStuffFactory, гарантирует отсутствие неразрешенных проблем, если отсутствует lib2.a.

Внимание! Необходимо убедиться, что цель сборки, включающая библиотеку, используетфлаг компоновщика -ObjC, иначе класс фабрики будет оптимизирован, так как на него нет ссылок во время компиляции.

1 голос
/ 29 октября 2010

Не можете ли вы в target-C использовать статическую библиотеку для добавления категории - с новыми методами в существующий класс target-C.

Так что, если lib1.a содержит

@interface SomeObjectThatWantsToCallback

Тогда lib2.a будет содержать определение

@interface SomeObjectThatWantstoCallBack (CallbackImpl)
-(void)HookProc:{
}

Теперь, если код в SomeObjectThatWantsToCallBack в lib1.a должен вызвать HookProc, он может сделать

if( [self respondsToSelector: @selector( HookProc: )])
  [self HookProc];

Ну, как-то так.Предполагая, что был добавлен код lib2.a, категория должна была расширить класс с помощью метода.

0 голосов
/ 29 октября 2010

Если вы сделаете так, чтобы хук регистрировался сам, то наличие кода перехвата само регистрировалось бы, а отсутствие такового не было бы.Очевидно, что вызывайте только зарегистрированные функции ловушек из lib1.a, и все готово: -

Вам не нужно делать ничего сложного, просто используйте основные функции c / c ++ / obj-cполучить такое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...