1

環境:

  • モノタッチ (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への非パブリック参照があります。NSNotificationCenterNSNotification

通知は開始するのに適した場所のように思えましたが、そこに通知名への参照が見つかりませんでした。それでは、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 を返すのはなぜですか? アセンブリに対する完全な権利を持っていないためですか?この環境で完全な権利を取得することは可能ですか?

4

0 に答える 0