ハイテク講座/Objective-C.1
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
ごきげんよう、ハイテクです。
さすがに投げっぱなしもナニなので、Objective-Cの説明もやっ...
&br;
*** Objective-Cとは [#kd558520]
Objective-C = C + Objective Runtime
以上。
&br;
というのも投げ過ぎな気がするので説明するに。
C言語にオブジェクト指向の概念を導入するにあたって
言語の仕様を変えたもの >>> C++
言語に沿って仕組みを追加したもの >>> Objective-C
な感じです。
元はどこかの学者がSmallTalkというのを参考にCの拡張をやら...
コーラ売りのスカリーにAppleを追い出されたジョブズが立ち上...
NeXTStepという会社、と同名の(ワークステーション気味な)...
ソイツに正式採用されたのが始まりの、まさにギークのための...
しかしAppleが色々あって傾いて、次世代OSの開発に失敗し、と...
BeOSになりかけたはずがジョブズ復活でNeXTStepベースのMacOS...
継続して標準言語の立場を得たのが、最近の神がかってるApple...
あとはiPhone向けの唯一の開発言語と言う立ち位置により最近...
ほんとなんか妙に元気ですよね、最近。2.0とか出ましたし。
閑話休題。
C++はクラスだのオーバロードだのなんだの
便利そうな機能のを盛りだくさんに沢山入れてくれやがりまして
それ故に色々にできるけど、スマートさに欠け、邪魔で面倒で...
対してObjective-Cは、C言語を生かし切った、ランタイムとし...
ラクチンな記述のために文法表現は多少に拡張された物の
それらはプリプロセッサによりC言語のコードに変換されます。
最低限の機能すらもライブラリとして外部に実装し、シンプル...
それを生かしてる感じがとても素敵じゃありません?
*** 速さ [#p80f65ba]
Cよりは遅く、C++よりは遅く、しかしJavaなどよりかは比較に...
C/C++より遅いのはオブジェクトシステムのランタイムの処理の...
(メソッド呼び出し毎に名前による解決が行われる)があるか...
しかしネイティブ動作する故にVM越しのJavaなどとは比較にな...
速度を稼ぎたい場合は
- 処理をC言語で書く
- メソッド呼び出しの中身を取り出し、関数ポインタ呼び出し...
- もちろんインラインでアセンブラかけます。
が主なやりかた。
Objective-Cの流儀としましては
- 面倒くさいが速度が優先されない部分はObjective-Cで。
- 処理の中心、高速化が必要な部分はCで。
と書き分けるのが、とても幸せなのです。
*** ダイナミックさ [#k33a7475]
Objective-Cが他のオブジェクト指向言語と決定的に違うのは、...
スクリプト言語ならばともかく、そうでなくこんな特性を持っ...
全てのオブジェクトは、日常的にid型で受け渡しされます。
それというのはJavaで言うところのObject型ですね。
そう、あの、Javaが嫌って嫌って仕方ない、自己矛盾の象徴た...
JavaはObject型が大嫌いで、なにかと他の型に入れたがる習性...
Objective-Cはそうではないのです。寛大な心で言うのです。
型なんて、書いた奴だけわかってればよくね?(ぉ
「プログラマにできることを制限しない」のですよ。
最近はこうるさい人が増えてきたせいで型チェックとかもする...
基本的に、好き勝手にメッセージ投げられます、いぇい。
シロートの為にガチガチに固まったJavaとは違うんだぜぃ。
インスタンスメソッドの実行中の動的追加とか、他の言語では...
*** クラスとインスタンス [#k1a15e96]
オブジェクト指向言語なので、クラスの概念があります。
ただし、SmallTalk流なので他に慣れてると違和感あるかも。
僕はC++からこっちに移ったのですが、楽過ぎて死ぬ。
細かいクラスの記述方法とかは、面倒くさいのでXCodeの支援を...
どうせ一から書くことはまずないです。
ミソは、1つのクラスはxxx.hとxxx.mの2ファイルから構成され...
xxx.hは、C言語と同じくヘッダファイル(header file)
xxx.mは、Objective-Cソースファイル。(mはmethodのmらしい)
xxx.hの方にインスタンス変数についてとか公開するメソッドと...
xxx.mの方にメソッドとか実際の処理内容を書いていきます。
*** メッセージ式 [#x4afea30]
Objective-Cのメソッドの呼び出しは
[object method];
とやります。
引数、返り値付きだと
val = [object methodWithFirstArg:arg1 secondArg:arg2];
さらに、返り値を引数にさらに多重メッセージも出来ます。
lowerName = [[object name] lowerString];
ただし、もちろん。
C言語の関数呼び出しも日常的に使います。
int r = random();
標準ライブラリ辺りで済むようなのなら、そっちの方が速いし...
*** オブジェクトの作り方 [#w85d7ddd]
インスタンスの生成はクラスに対してallocを呼びインスタンス...
それに続いて返ってきたのに対してinitを呼んで初期化するこ...
id obj = [[NSObject alloc] init];
他にも
id obj = [NSString stringWithInteger:1];
なんてのもあります。
*** メモリ管理 [#r2026e41]
メモリ管理は古くからのretain-release法と、ガーベジコレク...
が、ガーベジコレクション挙動が怪しいので、ここでは却下。
- retain-release法
-- 全てのオブジェクトはRetainCount(ライフ)を持ってる
-- allocされると、1になる。
-- retainされると、+1される。
-- releaseされると、-1される。
-- autoreleaseされると、そのうちに-1される。
-- 0になったオブジェクトは、破棄される。
これはNSAutorelasePoolとかいうクラスが裏でこそこそとなん...
まー、使ってりゃそのうち慣れるよ。
new-deleteよりかは楽。
*** 他との共存とか [#z2f09caf]
他との共存の為にいくつか面白いコト。
- 文字列
NSString *str = @"もじもじ";
という風に@を"の前に付けます。
すると、Objective-Cの、NSStringオブジェクトになります。
(実際はCFStringだったりするんだけど、それは気にしない。)
ってことは当然に
char *str = "Cの文字";
だとC言語のcharの配列になります。
- ポインタと配列
インスタンスオブジェクトへの参照はポインタとして扱うので
NSString *str[10];
str[0] = @"Zero";
...
などというようにインスタンスオブジェクトの配列が作れます。
作ってどうするのか、なんて聞いちゃダメです。
普通は
NSArray *array = [NSArray arrayWithObjects: @"Zero", @"O...
とかで配列クラスを使います。
- NS
色々あって接頭詞に「NS」が付いてます。
由来はNeXTStepと聞きます。
理由ってのは、クラスに名前空間がなかったりとか色々。
- C++
当然に共存できます。Objective-C++。
C++のライブラリを使いたいと気とかによくやります。
*** まとめ [#jd642be1]
以上、だらだらと書きました。
興味がある人は本とか読んでみるといいと思うよ。
オススメは[[荻原本:https://www.amazon.co.jp/dp/4797346809...
次回は、・・・なにする?
いい加減に初心者向けを?
終了行:
ごきげんよう、ハイテクです。
さすがに投げっぱなしもナニなので、Objective-Cの説明もやっ...
&br;
*** Objective-Cとは [#kd558520]
Objective-C = C + Objective Runtime
以上。
&br;
というのも投げ過ぎな気がするので説明するに。
C言語にオブジェクト指向の概念を導入するにあたって
言語の仕様を変えたもの >>> C++
言語に沿って仕組みを追加したもの >>> Objective-C
な感じです。
元はどこかの学者がSmallTalkというのを参考にCの拡張をやら...
コーラ売りのスカリーにAppleを追い出されたジョブズが立ち上...
NeXTStepという会社、と同名の(ワークステーション気味な)...
ソイツに正式採用されたのが始まりの、まさにギークのための...
しかしAppleが色々あって傾いて、次世代OSの開発に失敗し、と...
BeOSになりかけたはずがジョブズ復活でNeXTStepベースのMacOS...
継続して標準言語の立場を得たのが、最近の神がかってるApple...
あとはiPhone向けの唯一の開発言語と言う立ち位置により最近...
ほんとなんか妙に元気ですよね、最近。2.0とか出ましたし。
閑話休題。
C++はクラスだのオーバロードだのなんだの
便利そうな機能のを盛りだくさんに沢山入れてくれやがりまして
それ故に色々にできるけど、スマートさに欠け、邪魔で面倒で...
対してObjective-Cは、C言語を生かし切った、ランタイムとし...
ラクチンな記述のために文法表現は多少に拡張された物の
それらはプリプロセッサによりC言語のコードに変換されます。
最低限の機能すらもライブラリとして外部に実装し、シンプル...
それを生かしてる感じがとても素敵じゃありません?
*** 速さ [#p80f65ba]
Cよりは遅く、C++よりは遅く、しかしJavaなどよりかは比較に...
C/C++より遅いのはオブジェクトシステムのランタイムの処理の...
(メソッド呼び出し毎に名前による解決が行われる)があるか...
しかしネイティブ動作する故にVM越しのJavaなどとは比較にな...
速度を稼ぎたい場合は
- 処理をC言語で書く
- メソッド呼び出しの中身を取り出し、関数ポインタ呼び出し...
- もちろんインラインでアセンブラかけます。
が主なやりかた。
Objective-Cの流儀としましては
- 面倒くさいが速度が優先されない部分はObjective-Cで。
- 処理の中心、高速化が必要な部分はCで。
と書き分けるのが、とても幸せなのです。
*** ダイナミックさ [#k33a7475]
Objective-Cが他のオブジェクト指向言語と決定的に違うのは、...
スクリプト言語ならばともかく、そうでなくこんな特性を持っ...
全てのオブジェクトは、日常的にid型で受け渡しされます。
それというのはJavaで言うところのObject型ですね。
そう、あの、Javaが嫌って嫌って仕方ない、自己矛盾の象徴た...
JavaはObject型が大嫌いで、なにかと他の型に入れたがる習性...
Objective-Cはそうではないのです。寛大な心で言うのです。
型なんて、書いた奴だけわかってればよくね?(ぉ
「プログラマにできることを制限しない」のですよ。
最近はこうるさい人が増えてきたせいで型チェックとかもする...
基本的に、好き勝手にメッセージ投げられます、いぇい。
シロートの為にガチガチに固まったJavaとは違うんだぜぃ。
インスタンスメソッドの実行中の動的追加とか、他の言語では...
*** クラスとインスタンス [#k1a15e96]
オブジェクト指向言語なので、クラスの概念があります。
ただし、SmallTalk流なので他に慣れてると違和感あるかも。
僕はC++からこっちに移ったのですが、楽過ぎて死ぬ。
細かいクラスの記述方法とかは、面倒くさいのでXCodeの支援を...
どうせ一から書くことはまずないです。
ミソは、1つのクラスはxxx.hとxxx.mの2ファイルから構成され...
xxx.hは、C言語と同じくヘッダファイル(header file)
xxx.mは、Objective-Cソースファイル。(mはmethodのmらしい)
xxx.hの方にインスタンス変数についてとか公開するメソッドと...
xxx.mの方にメソッドとか実際の処理内容を書いていきます。
*** メッセージ式 [#x4afea30]
Objective-Cのメソッドの呼び出しは
[object method];
とやります。
引数、返り値付きだと
val = [object methodWithFirstArg:arg1 secondArg:arg2];
さらに、返り値を引数にさらに多重メッセージも出来ます。
lowerName = [[object name] lowerString];
ただし、もちろん。
C言語の関数呼び出しも日常的に使います。
int r = random();
標準ライブラリ辺りで済むようなのなら、そっちの方が速いし...
*** オブジェクトの作り方 [#w85d7ddd]
インスタンスの生成はクラスに対してallocを呼びインスタンス...
それに続いて返ってきたのに対してinitを呼んで初期化するこ...
id obj = [[NSObject alloc] init];
他にも
id obj = [NSString stringWithInteger:1];
なんてのもあります。
*** メモリ管理 [#r2026e41]
メモリ管理は古くからのretain-release法と、ガーベジコレク...
が、ガーベジコレクション挙動が怪しいので、ここでは却下。
- retain-release法
-- 全てのオブジェクトはRetainCount(ライフ)を持ってる
-- allocされると、1になる。
-- retainされると、+1される。
-- releaseされると、-1される。
-- autoreleaseされると、そのうちに-1される。
-- 0になったオブジェクトは、破棄される。
これはNSAutorelasePoolとかいうクラスが裏でこそこそとなん...
まー、使ってりゃそのうち慣れるよ。
new-deleteよりかは楽。
*** 他との共存とか [#z2f09caf]
他との共存の為にいくつか面白いコト。
- 文字列
NSString *str = @"もじもじ";
という風に@を"の前に付けます。
すると、Objective-Cの、NSStringオブジェクトになります。
(実際はCFStringだったりするんだけど、それは気にしない。)
ってことは当然に
char *str = "Cの文字";
だとC言語のcharの配列になります。
- ポインタと配列
インスタンスオブジェクトへの参照はポインタとして扱うので
NSString *str[10];
str[0] = @"Zero";
...
などというようにインスタンスオブジェクトの配列が作れます。
作ってどうするのか、なんて聞いちゃダメです。
普通は
NSArray *array = [NSArray arrayWithObjects: @"Zero", @"O...
とかで配列クラスを使います。
- NS
色々あって接頭詞に「NS」が付いてます。
由来はNeXTStepと聞きます。
理由ってのは、クラスに名前空間がなかったりとか色々。
- C++
当然に共存できます。Objective-C++。
C++のライブラリを使いたいと気とかによくやります。
*** まとめ [#jd642be1]
以上、だらだらと書きました。
興味がある人は本とか読んでみるといいと思うよ。
オススメは[[荻原本:https://www.amazon.co.jp/dp/4797346809...
次回は、・・・なにする?
いい加減に初心者向けを?
ページ名: