環境:
- モノタッチ (6.2.1.201)
- Mac OSX (10.8.3)
- iOS シミュレーター 6.0
NSNotifications
必要な が に登録されていることを確認するテストを作成しようとしていNSNotificationCenter.DefaultCenter
ます。問題ありません、と思いました。のリストがNotifications
あり、何が登録されているかを尋ねることができDefaultCenter
ます...
ああ、待って、いいえ、できません。:\
OK、まあ、クラスに反映して、作成したオブザーバーの (プライベート) リストを取得し、そこにチェックインできます。それがオブジェクトのリストNSObjects
であることを除いて。MonoTouch.Foundation.InternalNSNotificationHandler
OK、検査をしましょう。これInternalNSNotificationHandler
は内部クラスであり、 「notificationCenter」と「notify」MonoTouch.Foundation
への非パブリック参照があります。NSNotificationCenter
NSNotification
通知は開始するのに適した場所のように思えましたが、そこに通知名への参照が見つかりませんでした。それでは、notificationCenter を確認してみましょう。そこにそれがある!でnotificationCenter.__mt_ObserverList_var._items[i].Name
。__mt_ObserverList_var
(これは です)に反映しようとしたList<ObservedData>
ので、それらをループして を.Names
リストと比較し、それらがすべてそこにあることを確認できました。
var ifcType = typeof(myClass);
var observerField = ifcType.GetField("_observers", BindingFlags.NonPublic | BindingFlags.Static);
var observers = observerField.GetValue(null);
var internalNSNotHandlerType = observers[0].GetType();
// so far so good
var notCenterField = internalNSNotHandlerType.GetField("notificationCenter", BindingFlags.NonPublic); // this returns null
私が何をしても、それはnullを返します。次のようにアセンブリから型をロードしようとしました:
var assembly = Assembly.GetAssembly(typeof(NSNotificationCenter));
var internalNSNotHandlerType = assembly.GetType("MonoTouch.Foundation.InternalNSNotificationHandler");
// so far so good
var notCenterField = internalNSNotHandlerType.GetField("notificationCenter", BindingFlags.NonPublic); // this returns null
そこにたどり着けないなら、 にもたどり着けないList<ObservedData>
。
これが常に null を返すのはなぜですか? アセンブリに対する完全な権利を持っていないためですか?この環境で完全な権利を取得することは可能ですか?