我知道category方法是可以覆盖系统的方法,但是当有几个category重写同一个方法的时候调用顺序是怎么样子的啊?我开始写代码测试了一下,看不出来是按什么顺序来的,总是后面创建的category的方法被调用,其他的都被覆盖了。。。很想知道这是为什么,怎么证实这一点,依据是什么。。。有知道的朋友指点一下下咯☺
伊谢尔伦2017-04-18 09:44:19
ランタイム メッセージ受け渡しメカニズムのコア関数 void objc_msgSend(id self,SEL cmd,...) に従ってメッセージを送信するには、まず現在のクラスから呼び出しメソッドを見つけます。見つからない場合は、メソッドの呼び出しを続けます。その親クラス レイヤーごとに検索し、同じメソッドがカテゴリーに対して書き換えられると、メッセージ配信プロセス中に、カテゴリー内のメソッドが最初に検索され、実行されます。複数のカテゴリが同じメソッドを呼び出す場合、Xcode は実行時に buildPhases -> Compile Sources で上から下の順序に従ってコンパイルされ、後入れ先出しに従って、コンパイル中に複数のカテゴリがスタックにプッシュされます。原則として、コンパイル後のメソッドが最初に呼び出されます。objc_msgSend がメソッドを見つけて呼び出すと、メッセージの送信は続行されなくなるため、いわゆるオーバーライドが形成されます。必ずしも、後で作成したものが呼び出されるというわけではありません。作成後の buildPhases->Compile Sources の場所によって異なります。