SIMBL с методом Swizzling - PullRequest
       17

SIMBL с методом Swizzling

1 голос
/ 11 ноября 2010

У меня есть большие проблемы с переопределением некоторых функций во внешнем приложении, к которому я использую SIMBL.

В этом приложении есть класс - назовем его «AppClass». В этом классе есть функция,

-(void)doSomething;

Я получил это от дампинга класса. весь интерфейс определяется как:

@interface AppClass : NSObject
{
}

Я пытаюсь переопределить эту функцию с помощью jr_swizzleMethod: withMethod: error:

Из-за отсутствия документации я пришел к следующему:

    #import "JRSwizzle.h"
    #import "AppClass.h"

@interface AppClass (MyPlugin)
- (void)myPlugin_doSomething;
@end

@implementation AppClass (MyPlugin)

- (void)myPlugin_doSomething {
 NSLog(@"lol?");
}

@end

@implementation MyPlugin

+ (void) load {
 Mylugin* plugin = [MyPlugin sharedInstance];

 NSError *err = nil;
 BOOL result = [NSClassFromString(@"AppClass") jr_swizzleMethod:@selector(doSomething) withMethod:@selector(myPlugin_doSomething) error:&err];

 if(!result)
  NSLog(@"<Plugin> Could not install events filter (error: %@)", err);

 NSLog(@"Plugin installed");
}



+ (MyPlugin *)sharedInstance {
 static MyPlugin* plugin = nil;

 if(plugin == nil)
  plugin = [[MyPlugin alloc] init];

 return plugin;
}

@end

Этого должно быть достаточно, верно? Но я получаю эту ошибку при компиляции:

Undefined symbols:
  "_OBJC_CLASS_$_AppClass", referenced from:
      l_OBJC_$_CATEGORY_AppClass_$_MyPlugin in MyPlugin.o
      objc-class-ref-to-AppClass in MyPlugin.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

Как мне решить эту проблему?

1 Ответ

2 голосов
/ 14 ноября 2010

Вы создаете плагин, который ссылается на символы в двоичном формате (приложение, которое вы пытаетесь расширить).Следовательно, вы должны указать компоновщику, где искать эти символы (в вашем случае это _OBJC_CLASS_$_AppClass, то есть AppClass, что определено в двоичном файле.).

Это делается путем передачи опции -bundle_loader executable_name компоновщику.См. справочную страницу по ld .

...