Идентификаторы класса Objective-C имеют префикс objc_class_ вместо _OBJC_CLASS_$_

Я пытаюсь использовать некоторые методы в приложении, созданном с помощью Objective-C. Я получаю эту ошибку:

Symbol not found: _OBJC_CLASS_$_IASAvatarViewController

После открытия исполняемого файла в Hopper, я вижу, что все классы имеют префикс objc_class_ вместо. Итак, имя класса метода, который я пытаюсь описать, objc_class_IASAvatarViewController, Во-первых, мне не терпится узнать, как идентификаторы классов оказались такими (какое-то искажение имен?). И во-вторых, я хотел бы знать, возможно ли, чтобы моя dylib ссылалась на правильный идентификатор.

DylibTest.h:

#import <UIKit/UIKit.h>
#import <objc/runtime.h>

@interface IASBaseViewController : UIViewController

@end

@interface IASAvatarViewController : IASBaseViewController

@end

@interface IASAvatarViewController (Swizzle)

@end

DylibTest.m

#import "DylibTest.h"
#import <dlfcn.h>

@implementation IASAvatarViewController (Swizzle)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [self class];

        SEL originalSelector = @selector(viewDidLoad);
        SEL swizzledSelector = @selector(xxx_viewDidLoad);

        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);

        BOOL didAddMethod =
        class_addMethod(class,
                    originalSelector,
                    method_getImplementation(swizzledMethod),
                    method_getTypeEncoding(swizzledMethod));

        if (didAddMethod) {
            class_replaceMethod(class,
                            swizzledSelector,
                            method_getImplementation(originalMethod),
                            method_getTypeEncoding(originalMethod));
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
 }


 - (void)xxx_viewDidLoad {
    [[[UIAlertView alloc] initWithTitle:@"Swizzled method" message:@"Ya swizzle" delegate:nil cancelButtonTitle:@"Yeah. Okay" otherButtonTitles:nil] show];

    [self xxx_viewDidLoad];
 }

 @end

И снимок экрана Хоппера с классами Objective-C: Снимок экрана Хоппера

Изменить: Получил достаточно репутации, чтобы напрямую публиковать изображения.

Edit2: class-dump файла: http://pastebin.com/DcUD5AL5

0 ответов

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