цель c — defaultUserNotificationCenter, вызывающий ошибку «нераспознанный селектор» в переполнении стека

Я пытаюсь получить доступ defaultUserNotificationCenter в моем приложении C ++, и я не могу заставить это работать. Код ниже вызывает ошибку:

[NSUserNotificationCenter defaultUserNotificationCenter]: нераспознанный селектор, отправленный в экземпляр $ memory-location-to-notifCenter

за исключением поднятой в последней строке.

id notifCenter = (id)objc_getClass("NSUserNotificationCenter");
notifCenter = objc_msgSend(notifCenter, sel_registerName("alloc"));
notifCenter = objc_msgSend(notifCenter, sel_registerName("defaultUserNotificationCenter"));

Я пробовал это без allocИНГ notifCenter Однако это вызывает notifCenter быть ноль даже до того, как я доберусь до ...defaultUser... с файлом Info.plist, содержащим идентификатор пакета, или без него.

Просто чтобы убедиться, что ничего не происходит за кулисами defaultUserNotificationCenter Я написал небольшую программу Obj-C, чтобы сделать то же самое (NSUserNotificationCenter *defNotifCenter = [NSUserNotificationCenter defaultUserNotificationCenter];) и загрузил его в Hopper, чтобы проверить сборку, и он показал:

    mov  rsi, qword [0x100001128] ;@selector(defaultUserNotificationCenter)
mov  rdi, qword [objc_cls_ref_NSUserNotificationCenter]
call imp___stubs__objc_msgSend

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

0

Решение

Если вы позвоните alloc в классе Objective-C вы получите указатель на новый пример этого класса.

id notifCenter = (id)objc_getClass("NSUserNotificationCenter");
notifCenter = objc_msgSend(notifCenter, sel_registerName("alloc"));

С этой точки зрения, notifCenter был переназначен на новый экземпляр NSUserNotificationCenter, Он больше не является ссылкой на экземпляр класса и больше не имеет доступа к методам класса.

notifCenter = objc_msgSend(notifCenter, sel_registerName("defaultUserNotificationCenter"));

Теперь вы звоните учебный класс метод на пример этого класса. Вы можете вызывать только методы экземпляра для экземпляра, а методы класса — для экземпляра класса.

Я думаю, что это будет работать, если вы просто удалите среднюю линию (строку с alloc).

Я также думаю, что вы должны изучить Objective-C ++, используя файлы .mm. Довольно приятно использовать сам Objective-C, а не напрямую управлять средой выполнения.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]