イントロ
Objective-Cを学ぶ前に、私は最初にPHPでプログラミングし、次にPythonとRubyでプログラミングしました。 私はRubyが一番好きでした。 私はそのシンプルさ、簡潔さが好きでしたが、同時に力もありました。 そして、約1週間前、ついに自分のコンピューターでハックイントッシュを手に入れることができました(今ではMacbook Early 2008 Blackを持っています)。 OS X Lion Golden Masterであることが判明しました。 ポピーとiPhoneのアプリケーションがObjective-Cで作成することを知っていたので、それを学ぼうとさえしましたが、OS Xがなければ、おそらく不快でした。 Xcode 4.2をインストールした後(既にiOS開発者として登録済みです)、非常にシンプルなコンソールアプリケーションをいくつか作成しました。 そして、チュートリアルに従うたびに、または自分でコードを記述しようとするたびに、RubyとObjective-Cには多くの共通点があることがわかりました(両方の言語は
Smalltalkの影響下で作られたため、これは論理的ですが)、これらの2つの言語にはまったく異なる目的があるという事実にもかかわらず。
そのため、ここでは、RubyプログラマーがObjective-Cを理解するのに役立ついくつかのことを説明します。ほとんどの場合、コードはありません。 また、いくつかのことが完全に説明されていない場合は謝罪します。私はRubyの世界から来ました。
1.ダイナミック
私たちは皆、Rubyが動的なプログラミング言語であることを知っています。 しかし、Objective-Cはどうですか? これはCの単なるアドオンですか? そうでもない。 Objective-Cもある程度動的な言語であることがわかりました。 その中で、多くのこと(たとえば、メッセージの送信)と決定は、コンパイル中ではなく、起動時に直接行われます。
2.オブジェクトモデル
Rubyでは、すべてがオブジェクトです。 Objective-Cの場合、これは常に正しいとは限りません。 Cのアドオンであるため、基本データ型(
char、float、double、int、structなど )はオブジェクトではありません。 ただし、Foundationフレームワークでは、文字列、可変配列、ハッシュなどの一見馴染みのあるものだけでなく、その上に機能的なラッパーが表示されます。
3.メッセージを送信する
Rubyでは、オブジェクトメソッドを呼び出すと、暗黙的なメッセージが送信されます。
object.send :method, args
つまり、メソッド呼び出しはメッセージの送信に変換されます。 Objective-Cでは、同様のことが起こります。
[object method];
これは、メソッド呼び出しではなくメッセージを送信するだけです。存在しないメソッドを呼び出すと、コンパイル段階ではエラーが発生せず、実行時にのみエラーが発生します(言語のダイナミズムを証明します)。 コンパイル時に、
[object method]
C番目の関数
objc_sendMsg(id object, SEL selector)
呼び出しに変換され
objc_sendMsg(id object, SEL selector)
。
farcallerがコメントで示唆しているように:存在しないメソッドでclang3を使用するとコンパイルエラーが発生する場合がある
ところで、C ++の用語では、RubyとObjective-Cのメソッドは仮想です。
4.緩いタイピング
すべてのハッカーは、Rubyでは変数の種類を気にする必要がないことを知っています。 しかし、Objective-Cが原則的に行うことも、誰もが知っているわけではありません。 オブジェクトのタイプがわからない場合は、Objective-CでオブジェクトIDのタイプを指定できます。つまり、変数は任意のタイプの値を取ることができます。 実際、idは任意のオブジェクトへのポインターです。
ただし、Cタイプの場合、Objective-Cオブジェクトに対してのみ機能します。 多くのタイプのCには、Objective-Cの実装(NSNumber、NSString、NSArrayなど)があるため、Cのタイプに頼ることがまれに必要になる場合があります。
5.クラス宣言、オブジェクト作成、およびプロパティ
Rubyでは単純にクラスに定義できますが、Objective-Cではクラス自体の説明と実装を定義する必要があります。 通常、説明と実装は異なるファイルにあります。 Rubyでは、任意のメソッドから任意のオブジェクト変数を定義できますが、Objective-Cでは、クラス内で使用されるすべての変数を事前に定義する必要があります。
原則として、オブジェクトは両方の言語で非常に簡単に作成されます。 Rubyでは、単にクラスに
new
メッセージを送信できます
myObject = MyClass.new
Objective-Cでは、最初にオブジェクトにメモリを割り当てる(
alloc
)必要があり、次に初期化する(
init
、
initWith…
)
MyClass * myObject = [[MyClass alloc] init];
インスタンス変数にアクセスするには、getterとsetterの2つのメソッドを定義する必要があります。 Rubyでは、
attr_accessor :var
簡単に記述できます
attr_accessor :var
-Cでは、クラス変数の説明セクションに
@property(retain) type * variable;
、
@property(retain) type * variable;
記述
@property(retain) type * variable;
メソッドの説明の後、および
@synthesize variable;
クラスの実装。
小さな余談:Objective-CはCのアドオンであるため、メモリの管理も強制されます。 LLVMコンパイラは、1つの興味深い機能をサポートしています。これは、メモリの解放を処理する自動参照カウントです。 Xcodeバージョン4.2以降では、デフォルトでLLVMコンパイラを使用します。つまり、メモリ管理について心配する必要はありませんが、原則として、言語を完全に理解するには、メモリ管理のようなそれほど単純ではないトピックを理解することをお勧めします。6.プロトコルとミックスイン
Rubyでは、モジュールを定義してクラスにミックスできるため、多重継承のようなものが実装されます。 Objective-Cは特にそうではありません。 しかし、プロトコルがあります。
ウィキペディアが言うように:
プロトコルは、メソッド記述の単なるリストです。 プロトコルに記述されているすべてのメソッドの実装が含まれている場合、オブジェクトはプロトコルを実装します。 プロトコルは、異種オブジェクトの一般的な機能を強調し、以前は未知のクラスのオブジェクトに関する情報を送信できるという点で便利です。
つまり、たとえば、メソッドはSerializableプロトコルを実装するオブジェクトを受け取り、オブジェクトが
serialize
メッセージに応答していることを確認できます。
7.クラスのカテゴリと拡張
クラスを拡張したい場合、Rubyで次のように書くことができます。
class String def my_super_method “New string” end end
したがって、クラスに
my_super_method
メソッドを追加し
my_super_method
(ただし、これが唯一の方法ではありません)。 Objective-Cでは、カテゴリを使用して同様のことができます。
@interface NSString (HelloWorld) + (NSString *)helloWorld; @end @implementation NSString (HelloWorld) + (NSString *)helloWorld { return @”Hello, World!”; } @end
通常、カテゴリはExtensibleClass + NameCategoryファイル-NSString + HelloWorld.mおよびNSString + HelloWorld.hに保存され、インポートされます。
ここに、Objective-Cの理解を容易にしたもののほんの一部を示します。 あなたが興味を持っていたことを願っています。 頑張って次のことに注意することをお勧めします。