Objective-C runtimeの運転時の基本的な特徴(一)
3639 ワード
Objective-C runtimeの運転時の基本的な特徴(一)
著者:wangzz
原文の住所:http://blog.csdn.net/wzzvictory/article/details/8615569
転載は出典を明記してください.
もし文章があなたに役に立つと思いましたら、メッセージやWeChat公式アカウントwangzstriveを通じて応援してください.ありがとうございます.
動的プログラミング言語として、Objective-Cは可能な限りコンパイルとリンク時にすることを実行時に延期します.可能であれば、Objective-Cは常に動的な方法で問題を解決します.これはObjective-C言語がコンパイル環境を必要とするだけでなく、実行時にシステムがコンパイルされたコードを実行する必要があることを意味します.実行時システムが演じる役割はObjective-C言語に似たオペレーティングシステムで、Objective-Cはこのシステムに基づいて動作します.ですから、runtimeはObjective-Cの魂のように多くのものがこの基礎の上に現れます.ですから、価値のあるあなたは工夫をして理解します.
私たちはObjective-Cの運行を以下のいくつかの方面から理解します.
一、静的言語のコンパイル後との違い
1、静的言語
静的な言語プログラムは、以下のようなCプログラムです.
2、Objective-C
よくあるメッセージ送信文:
私の理解では、コンパイル段階では、receiverの対象にメッセージを送ることを確定しただけですが、送信されていません.本当に送るのは、実行時に行います.したがって、コンパイル段階では、message方法の具体的な実現が全く分かりません.さらに、この方法が実現されるかどうかは分かりません.これは運行時に崩壊する可能性があります.
二、Objective-c runtimeのいくつかの点について説明します.
1、runtimeはオープンソースです.
はい、見間違えていません.runtimeは確かにオープンソースです.現在はアップル社とGNUはそれぞれ1つのオープンソースのruntimeバージョンを維持していますが、この2つのバージョンは一致しているように努力しています.アップルのバージョンはこのリンクを猛クリックしてobjc 4-437.1.tar.gzをダウンロードできます.
2、runtimeはC言語で実現されます.
runtimeはObjective-Cの最も核心的な部分として、ほとんど全部C言語で実現します.ここの「ほぼ」という例外は含まれている方法(例えば、以下に述べるobjcmumsgSend方法)でもアセンブリで実現されます.
3、runtimeの二つのバージョン
Objective-Cの運行時、システムは二つの既知バージョンがあります.初期バージョンと現行バージョン(Moden).現行バージョンでは、最も顕著な新特性は、インスタンス変数が「ロバスト」であることである.初期バージョンでは、クラス内のインスタンス変数のレイアウトを変更すると、そのクラスのすべてのサブクラスを再コンパイルしなければなりません.現行バージョンでは、クラス内のインスタンス変数のレイアウトを変更すると、このクラスの任意のサブクラスをコンパイルする必要がありません.また、現行バージョンでは、propertyのsynthesis属性器をサポートします.
現在のiPhoneプログラムとMac OS X v 10.5および以降のシステムの64ビットプログラムはすべてObjective-Cの実行時のシステムの現行バージョンを使用しています.他の場合(Mac OS Xシステムの32ビットプログラム)は初期バージョンを使用しています.
三、runtime systemとインタラクティブな三種類の方式
1、Objective-Cソースコードを通じて
ほとんどの場合、システムはバックグラウンドで自動的に動作します.Objective-Cソースコードを作成してコンパイルします.Objective-Cクラスと方法をコンパイルすると、言語動態特性を実現するために、いくつかのデータ構造と関数が自動的に作成されます.これらのデータ構造はObjective-C 2.0のプログラム設計言語で定義されたようなクラス定義とプロトコル定義の情報を含んでいます.クラスのセクションで議論されているクラスのオブジェクトとプロトコルクラスのオブジェクト、メソッドのスケーリング、インスタンス変数テンプレート、およびその他のソースコードからの情報です.実行時システムの主な機能はソースコードの表現に従ってメッセージを送信します.
2、類NSObjectによる方法
CocoaプログラムのほとんどはNSObject類のサブクラスですので、ほとんどはNSObject類の方法を継承していますので、NSObjectの行為を継承しています(NSProxy類は例外です)しかし、場合によってはNSObject類は、ある事柄を完了するためのテンプレートだけを定義していて、必要なコードをすべて提供していない場合があります.このプログラムの内容を元に戻す方法は、例えば、元の文字列を元に戻すという方法です.このプログラムの内容は、元の文字列を元に戻す方法です.文字列.NSObjectクラスでは、この方法の実装は、サブクラスのコンテンツを知らないので、クラスの名前とオブジェクトのアドレスだけを返すことができます.NSObjectのサブクラスは、この方法を再実現して、より多くの情報を提供することができます.例えば、NSAray類は、この方法を書き換えて、NSAray類に含まれる各オブジェクトの内容に戻ります.
いくつかのNSObjectの方法は、単に実行時システムから情報を得て、オブジェクトをある程度自己検査するだけです.例えば、classは対象のクラスに戻ります.isKindOfClass:とisMembersOfClass:対象が指定されたクラスの継承システムにあるかどうかを確認します.reponds ToSelector:対象が指定されたメッセージに応答するかを確認します.conformTotocol:プロトコルクラスを指定する方法があります.methodForSelector:指定方法で実現されるアドレスを返します.
3、運転時システムの関数
実行時システムは、公開インターフェースのあるダイナミックライブラリで、データ構造と関数のセットから構成されています.これらのデータ構造と関数の宣言ヘッダファイルは、/usr/include/objcにあります.これらの関数は、純粋なCの関数で、Objective-Cと同じ機能を実現することができます.また、NSObjectのような方法の基礎を構成しています.開発ツールを提供することが可能になります.ほとんどの場合、Objective-Cプログラムは必須ではありませんが、Objectve-Cプログラムにはいくつかの関数が非常に有用です.これらの関数のドキュメントはObjective-C 2.0の実行時のシステム参照ライブラリを参照してください.
--------------未完続続----------
著者:wangzz
原文の住所:http://blog.csdn.net/wzzvictory/article/details/8615569
転載は出典を明記してください.
もし文章があなたに役に立つと思いましたら、メッセージやWeChat公式アカウントwangzstriveを通じて応援してください.ありがとうございます.
動的プログラミング言語として、Objective-Cは可能な限りコンパイルとリンク時にすることを実行時に延期します.可能であれば、Objective-Cは常に動的な方法で問題を解決します.これはObjective-C言語がコンパイル環境を必要とするだけでなく、実行時にシステムがコンパイルされたコードを実行する必要があることを意味します.実行時システムが演じる役割はObjective-C言語に似たオペレーティングシステムで、Objective-Cはこのシステムに基づいて動作します.ですから、runtimeはObjective-Cの魂のように多くのものがこの基礎の上に現れます.ですから、価値のあるあなたは工夫をして理解します.
私たちはObjective-Cの運行を以下のいくつかの方面から理解します.
一、静的言語のコンパイル後との違い
1、静的言語
静的な言語プログラムは、以下のようなCプログラムです.
#include < stdio.h >
int main(int argc, const char **argv[])
{
printf("Hello World!");
return 0;
}
はコンパイラの文法分析を経て、最適化して最適化されたコードをアセンブル言語に翻訳して、完全にあなたの設計したロジックとあなたのコードに従って上から下まで実行します.2、Objective-C
よくあるメッセージ送信文:
[receiver message]
はコンパイラに変換されます.objc_msgSend(receiver, selector)
パラメータがあれば、objc_msgSend(receiver, selector, arg1, arg2, …)
メッセージは、コンパイルされた論理ではなく、実行時にのみ関数と結合される.私の理解では、コンパイル段階では、receiverの対象にメッセージを送ることを確定しただけですが、送信されていません.本当に送るのは、実行時に行います.したがって、コンパイル段階では、message方法の具体的な実現が全く分かりません.さらに、この方法が実現されるかどうかは分かりません.これは運行時に崩壊する可能性があります.
二、Objective-c runtimeのいくつかの点について説明します.
1、runtimeはオープンソースです.
はい、見間違えていません.runtimeは確かにオープンソースです.現在はアップル社とGNUはそれぞれ1つのオープンソースのruntimeバージョンを維持していますが、この2つのバージョンは一致しているように努力しています.アップルのバージョンはこのリンクを猛クリックしてobjc 4-437.1.tar.gzをダウンロードできます.
2、runtimeはC言語で実現されます.
runtimeはObjective-Cの最も核心的な部分として、ほとんど全部C言語で実現します.ここの「ほぼ」という例外は含まれている方法(例えば、以下に述べるobjcmumsgSend方法)でもアセンブリで実現されます.
3、runtimeの二つのバージョン
Objective-Cの運行時、システムは二つの既知バージョンがあります.初期バージョンと現行バージョン(Moden).現行バージョンでは、最も顕著な新特性は、インスタンス変数が「ロバスト」であることである.初期バージョンでは、クラス内のインスタンス変数のレイアウトを変更すると、そのクラスのすべてのサブクラスを再コンパイルしなければなりません.現行バージョンでは、クラス内のインスタンス変数のレイアウトを変更すると、このクラスの任意のサブクラスをコンパイルする必要がありません.また、現行バージョンでは、propertyのsynthesis属性器をサポートします.
現在のiPhoneプログラムとMac OS X v 10.5および以降のシステムの64ビットプログラムはすべてObjective-Cの実行時のシステムの現行バージョンを使用しています.他の場合(Mac OS Xシステムの32ビットプログラム)は初期バージョンを使用しています.
三、runtime systemとインタラクティブな三種類の方式
1、Objective-Cソースコードを通じて
ほとんどの場合、システムはバックグラウンドで自動的に動作します.Objective-Cソースコードを作成してコンパイルします.Objective-Cクラスと方法をコンパイルすると、言語動態特性を実現するために、いくつかのデータ構造と関数が自動的に作成されます.これらのデータ構造はObjective-C 2.0のプログラム設計言語で定義されたようなクラス定義とプロトコル定義の情報を含んでいます.クラスのセクションで議論されているクラスのオブジェクトとプロトコルクラスのオブジェクト、メソッドのスケーリング、インスタンス変数テンプレート、およびその他のソースコードからの情報です.実行時システムの主な機能はソースコードの表現に従ってメッセージを送信します.
2、類NSObjectによる方法
CocoaプログラムのほとんどはNSObject類のサブクラスですので、ほとんどはNSObject類の方法を継承していますので、NSObjectの行為を継承しています(NSProxy類は例外です)しかし、場合によってはNSObject類は、ある事柄を完了するためのテンプレートだけを定義していて、必要なコードをすべて提供していない場合があります.このプログラムの内容を元に戻す方法は、例えば、元の文字列を元に戻すという方法です.このプログラムの内容は、元の文字列を元に戻す方法です.文字列.NSObjectクラスでは、この方法の実装は、サブクラスのコンテンツを知らないので、クラスの名前とオブジェクトのアドレスだけを返すことができます.NSObjectのサブクラスは、この方法を再実現して、より多くの情報を提供することができます.例えば、NSAray類は、この方法を書き換えて、NSAray類に含まれる各オブジェクトの内容に戻ります.
いくつかのNSObjectの方法は、単に実行時システムから情報を得て、オブジェクトをある程度自己検査するだけです.例えば、classは対象のクラスに戻ります.isKindOfClass:とisMembersOfClass:対象が指定されたクラスの継承システムにあるかどうかを確認します.reponds ToSelector:対象が指定されたメッセージに応答するかを確認します.conformTotocol:プロトコルクラスを指定する方法があります.methodForSelector:指定方法で実現されるアドレスを返します.
3、運転時システムの関数
実行時システムは、公開インターフェースのあるダイナミックライブラリで、データ構造と関数のセットから構成されています.これらのデータ構造と関数の宣言ヘッダファイルは、/usr/include/objcにあります.これらの関数は、純粋なCの関数で、Objective-Cと同じ機能を実現することができます.また、NSObjectのような方法の基礎を構成しています.開発ツールを提供することが可能になります.ほとんどの場合、Objective-Cプログラムは必須ではありませんが、Objectve-Cプログラムにはいくつかの関数が非常に有用です.これらの関数のドキュメントはObjective-C 2.0の実行時のシステム参照ライブラリを参照してください.
--------------未完続続----------