Подклассы в Objective C Runtime - PullRequest
       92

Подклассы в Objective C Runtime

0 голосов
/ 28 апреля 2020

Я пытаюсь реализовать решение из Как установить canBecomeKeyWindow? В мое родное C приложение, использующее Objective- C время выполнения (приложение уже написано с целью C Время выполнения). Есть ли способ создать подкласс исключительно в Objective- C Runtime?

Прямо сейчас я просто создаю NSWindow объект, но мне нужно иметь возможность создать свой собственный, чтобы я мог переопределить функцию, указанную в этом вопрос.

objc_msgSend((id)objc_getClass("NSWindow"), sel_registerName("alloc"));

1 Ответ

0 голосов
/ 28 апреля 2020

Понял это после большого количества поиска кода:

        // Subclass NSWindow with overridden function
        Class __NSWindow =
            objc_allocateClassPair(objc_getClass("NSWindow"), "__NSWindow", 0);
        class_addMethod(__NSWindow,
                        sel_registerName("canBecomeKeyWindow"),
                        (IMP)can_become_key_window_true, "B@:");
        objc_registerClassPair(__NSWindow);

        // Allocate a new __NSWindow
        window = objc_msgSend((id)__NSWindow, sel_registerName("alloc"));

А затем can_become_key_window_true определяется как:

static bool can_become_key_window_true() {
    return true;
}

Я использую objc_allocateClassPair для создать подкласс объекта и вернуть Class этого объекта. Затем я использую class_addMethod , чтобы переопределить метод canBecomeKeyWindow. И, наконец, используйте objc_registerClassPair , чтобы зарегистрировать мой новый класс, прежде чем использовать его, как если бы я был обычным NSWindow.

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