0

私のC++アプリケーションでdefaultUserNotificationCenterにアクセスしようとしていますが、これは動作しないようです。次のコードは、エラーの原因です:defaultUserNotificationCenterがC++で「認識できないセレクタ」エラーを起こしています

[NSUserNotificationCenter defaultUserNotificationCenter]: unrecognized selector sent to instance $memory-location-to-notifCenter

最後の行で例外が発生しています。私はnotifCenterをINGのallocせずにこれを試してみました

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

しかし、これは私がバンドル識別子を含むInfo.plistファイルの有無にかかわらず...defaultUser...に到達する前であってもnilにするnotifCenterの原因となります。

夢中必ず何をしないためには、私は同じことを行うには、小さなOBJの-Cプログラム(NSUserNotificationCenter *defNotifCenter = [NSUserNotificationCenter defaultUserNotificationCenter];)を書いて、アセンブリをチェックするためにホッパーにそれをロードし、それがあったdefaultUserNotificationCenterと舞台裏で起こる:

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

これは、今、私は完全に途方に暮れていますシステムレベルで起こって普通の何も表示されません。

+0

[NSNotificationCenter defaultCenter]を使用しますか? –

+0

@Land NSNotificationCenterはスレッド間で通知を送信するためのもので、私が探しているものではありません。 – JLegendre

+0

Objective-C++クラスを使用しない理由は何ですか?次にObjective-CをC++で使うことができます... objc_msgSendを直接使うのは良い考えではありません。 –

答えて

1

あなたはObjective-Cのクラスにallocを呼び出す場合は、新しいインスタンスへのポインタが返されますそのクラスの。

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

この時点で、notifCenterNSUserNotificationCenterの新しいインスタンスに割り当てられました。これはもはやClassインスタンスへの参照ではなく、もはやClassメソッドへのアクセス権を持ちません。

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

今、あなたはそのクラスのインスタンスクラスメソッドを呼び出しています。インスタンスのインスタンスメソッドとクラスインスタンスのクラスメソッドのみを呼び出すことができます。

真ん中の行(allocの行)だけを削除すると、これはうまくいくと思います。

また、.mmファイルを使用してObjective-C++を調べるべきだと思います。 Objective-C自体を使用し、ランタイムを直接駆動しない方が良いです。

+0

これはそれでした。 'objc_msgSend'で' objc_getClass'呼び出しをラップするのを忘れてしまったとは思いません。素晴らしい書き込み! – JLegendre

+0

ありがとうございました、あなたがそれを理解してうれしい;-) –

関連する問題