Я пытаюсь получить доступ 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
Это не показывает ничего необычного, происходящего на системном уровне, так что теперь я в полной растерянности.
Если вы позвоните 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, а не напрямую управлять средой выполнения.
Других решений пока нет …