スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

エラーメッセージ

泣いていいんでしょうか。

とんでもない量のエラーメッセージの数に押しつぶされています。

苦しい。

Cでは絶対こんなことにはならなかったのに。

やはり、実際にプログラム書くと全然違います。
スポンサーサイト

一次方程式を解くプログラムver.1.0の完成。

なんか、暇つぶしに一次方程式を解くプログラムを書きました。まだ整数しか入力できないけどね。まぁただそっからの拡張は簡単なんで、まだ拡張はしていません。あ、それにマイナスとかを入れるとまだ簡易的だから、+-2とか、先に+記号が入っちゃうんだけどね。あ、それに僕は今Objective-Cの勉強をしているはずなのに、Cで書いてしまった(笑)

...だってCの方がなれてるから。

完全版になったらブログにupしますね(そんなん他の人の方が100倍いいの作ってそうだけど)。

のし。

コンパイルミス

ずっと考えてて、やっと気づくことに成功しました!今回は説明気味ですが、まぁ説明じゃないです

ええとですね。なぜあんなメッセージが出たか?というと、例えばあれがsamp.mだったとして

cc samp.m
とコンパイルしてたんですね。まぁCではこんな感じだったんでいいと思ってたんですが、ここが間違いだった。実はですね。考えてみると、最初に(全角なのは許してください。なんか、HTMLのタグと勘違いされてるんでして、どうやって書くのか分からないだけなんです。)
#import <Foundation/NSObject.h>
を宣言しているんですね。

そして、コンパイルするときには、使ったフレームワークを

-framwork フレームワーク名

と宣言しなければならないんです。つまりこの場合は、

-framwork Foundation
と宣言するんですね。

あ、実行はCとかわりませんよ(最初のうちはかもしれないけど)オプションで実行ファイル名をいじらなかった場合、
./a.out
で実行できます。

それと、かなり悲しくなってくる僕のミスをもう一つ紹介します。それは、最初の部分で
#import <Foundation/NSObject>
とか書いてるんですね(全角なのは違います。HTMLでどうやって書くのか分からなかっただけです)。一瞬分からなかった人は、大丈夫です。僕、一瞬どころか5分間くらいうなっていましたから。これは実は、NSObjectのあとに.hが抜けてるんですね。なれていない証拠です。ちなみに、これはフレームワークの中にあるFoudation.framworkの中のHeadersの中の大量のNS~~.hの中の一つがNSObject.hなんですね。ちゃんと中にはコードがありますよ!見てみると思ったよりも短いコードです(注意!!下手するとプログラムが動かなくなるかもしれないので、{消したりしてしまうと}触らないに超したことはないかもしれません^^)。

そんな感じで、やはり一つ前の記事に書いた通り致命的なミスをしていましたが、まさかコンパイルの宣言時だとは思いませんでした。

では

初めてのプログラムで、コードよりも長いくらいのエラーメッセージが出てきて失神しそうなのは僕だけなのか?

何がいけないのか分からない。あ、今回は、説明じゃないんです。
実はですね。こんだけ説明している僕ですが、まだ実は一回もobj-cのプログラム書いたこと無かったんですね。で、書いてみたはいいんですが、なんか、コードとおんなじくらいのエラーメッセージの数でもう失神しそうです。ハイ。

でそのエラーメッセージがこれなんですが

Undefined symbols:
"_objc_msgSendSuper2", referenced from:
-[B method2] in ccvYp8hp.o
"__objc_empty_vtable", referenced from:
_OBJC_METACLASS_$_B in ccvYp8hp.o
_OBJC_CLASS_$_B in ccvYp8hp.o
_OBJC_METACLASS_$_A in ccvYp8hp.o
_OBJC_CLASS_$_A in ccvYp8hp.o
"_objc_msgSend", referenced from:
-[B method2] in ccvYp8hp.o
_main in ccvYp8hp.o
_main in ccvYp8hp.o
_main in ccvYp8hp.o
_main in ccvYp8hp.o
_main in ccvYp8hp.o
_main in ccvYp8hp.o
(maybe you meant: l_objc_msgSend_fixup_alloc)
"_objc_msgSend_fixup", referenced from:
l_objc_msgSend_fixup_alloc in ccvYp8hp.o
(maybe you meant: l_objc_msgSend_fixup_alloc)
"__objc_empty_cache", referenced from:
_OBJC_METACLASS_$_B in ccvYp8hp.o
_OBJC_CLASS_$_B in ccvYp8hp.o
_OBJC_METACLASS_$_A in ccvYp8hp.o
_OBJC_CLASS_$_A in ccvYp8hp.o
"_OBJC_CLASS_$_NSObject", referenced from:
_OBJC_CLASS_$_A in ccvYp8hp.o
"_OBJC_METACLASS_$_NSObject", referenced from:
_OBJC_METACLASS_$_B in ccvYp8hp.o
_OBJC_METACLASS_$_A in ccvYp8hp.o
_OBJC_METACLASS_$_A in ccvYp8hp.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

なんか、明らかに細かなコードミス(;つけ忘れみたいな)ではなく、致命的なミスをやらかしてるみたいなんですが、分からない。多分一文字間違ってるくらいのことなんだろうけど、翻訳してみてもほぼだめだし、なにがいけないんだろ。
多分、インスタンスの生成部分がおかしいんだろうけど、全然分からない。もしかすると、#importの時点で間違っているのかもしれない。
こんなんじゃ先が思いやられる。

ノシ

@interfaceで宣言しなかったメソッドを@implementationで書いてみるとどうなるか?

今回は表題通りのことです。簡単なことですんで数行で記事終了だと思われます
@説明開始

【@interfaceで宣言しなかったメソッドを@implementationで書いてみるとどうなるか?】
長い表題ですが、簡単です。@interfaceで宣言しなくてもメソッドはかけます。つまり、インターフェース部では書いてないため、クラス内で細かな動作しかできないメソッドを局所的に書くことができます。
しかし、一つ気をつければならない点があります。インターフェース部に書いていないだけあって、ふとしたときに変な動作をしても気づきにくくなってしまいます(上書きしたり)。このためこのようなメソッドの名前には特別な接続詞をつけると便利です(そう、appleが言っていました)。

@説明終了

予想通りの短い記事です

表題が長かったですが、記事は短かったですね

selfとsuperについて

今回は、selfと、superについて概要を書きたいと思います。

うーん。これからは、結構概要ばかりになるかもです

@説明開始

【self】
selfってなんだ?ってことになります。これはNSObjectにある(ほかにもあるのかな?objctとかにも)、メソッドの一つです。これは、インスタンスそのものを表すためのメソッドで例えば、helloというクラス内にあるメソッドを呼び出すときなどでは

   [self hello]
とすることで宣言可能です。

【super】
これもNSObjectの中にあるメソッドの一つで、これはスーパークラスにあるメソッドを表すためのメソッドです。つまり、これはNSObjectをクラスAが、クラスAをクラスBが、クラスBをクラスCが次々に継承していきます。クラスAには三つのメソッドがあり、クラスBでそのうちに一つ目と二つ目を上書き、クラスCで三つ目を上書きしたとき、クラスBの部分でクラスBのスーパークラスにあたる、クラスAの一つ目のメソッドを使いたいとき、このsuperというのを使います。宣言としては一つ目のメソッドをa、二つ目をb、三つ目をcとして
  クラスBにて
[super a]  //これにより、クラスBで上書きしているaメソッドをクラスAの時の物で使うことができる
  クラスCにて
[super c] //これにより上と同じようにクラスCのスーパークラスBの部分を使うことができます

こんな感じでしょうか。

@説明終了

結構分かりにくいですが、僕が自分では分かるのでよしとしています。(笑)もし、このページを通りかかって分からない部分がありましたら、できれば質問してくださるとありがたいです。(寂しいので...)

ではまた

インスタンスの生成、初期化

いやぁ未だにアクセスだれもしてくれないんですが(当たり前か)、まぁいいや。これはあくまで「勉強ログ」だから(汗)

今回は、実際オブジェクト生成にはどのようなことしなきゃいけないのかな?っていうことについて書きたいと思います。

@説明開始
【id型】
id型。一言でいうと、Cのint型同様変数の型ではないですが、オブジェクトの型です。宣言方法も全く同じで

id a;


のように宣言できます。これなんで説明したのかっていうと、この後オブジェクトを生成するときに使う変数だからです。まぁ、この変数どこからきたのか?っていわれないようにしときます

【オブジェクト生成】
コレも簡単です。あ、でもその前に一応確認。これからは、インスタンスと言った方が良い場合が増えてきて(今までも強引にオブジェクトって書き続けてきたけど)、さすがに、インスタンスと書かない訳にもいかないので、インスタンスと書きますが、このインスタンスとは?これは、オブジェクトのまとめてあるもの(属性とか)総称ということです。

はい、でインスタンス生成の時には、

[クラス名 alloc ]


と宣言します。こうすることで、インスタンスを作ることができる訳なんですね。ちょっとした例だとクラスAのインスタンス生成の時には

[A alloc ]


と宣言します。

【インスタンスの初期化】
そして、インスタンスの初期化を行います。このように初期化をしてくれるのをイニシャライザと言います。そして、インスタンスを初期化するためには絶対なきゃいけない初期化メソッドのことを「指定イニシャライザ」と呼ぶそうです。この指定イニシャライザはNSObjectには、「init」があります(そういえば、説明するのを忘れていましたが、mac以外(linuxやwin)の場合rootクラスにNSObjectを使うことはできません)。
宣言の方法は、一般的な方法としてインスタンスの生成後すぐに初期化するという方法があります

[[クラス名 alloc ] init ]


はい。そして、さっきのクラスAで考えると、

[[A alloc ] init ]


となります。

追記...
初期化の説明に誤りがありました。
http://small0programmer.blog119.fc2.com/blog-entry-28.html
ここで書き直しております
追記終了

@説明終了

簡単に説明するとこんな感じですかね。

次回はselfとかsuperとかの説明かな?まぁ今回はここまでです。

動的、静的。

ハイ。そして更なる更新です。次は、僕が少し意味分かんなかった言葉です。初心者だからこそ書ける記事かもです。
命題は、「動的、静的。」ですね。ほんと、appleのドキュメントや、wikipediaは分かりにくいんですよ。みても全くわからない。今回は、この二つの言葉に発展して、オブジェクト指向言語のメモリの使われ方について書きたいと思います。そしてさらには、ガベージコレクションにまで発展させていきたいと思います。もしかすると、時間的都合で二回に分けるかもしれませんが、書く前にそんなことは分からないので先に宣言しておきます。

@説明開始
【動的、静的】
動的。なんて言われてもなんにもわからない(だからこそ初心者なんだ!)。動的とは、プログラムの実行時に行われる処理、逆に静的とは、プログラムのコンパイル時に行われる処理のことだったんですね。これで、今回の命題についての説明は終わってしまいます。(こんな少しでいいんだから書いてくれればいいのに。って書いてあるのかな?知らないけど)なので、ついでにオブジェクト指向言語のメモリの使い方についても説明します。

【オブジェクト指向言語のメモリの使われ方①概要】
基本的にプログラムが実行するときにひつようなメモリ領域は三つです。静的領域とヒープ領域とスタック領域です。まず、静的領域はどのように使われるのか?この時の「静的」の意味は、文字通り動かないということを表しています。つまり、プログラムの開始から終了まで変わらない情報、つまり、グローバル変数や実行するコードを格納します。また、この二つを格納することから、静的変数領域、コード領域の二つに分けて説明することも多いです。
次に、ヒープ領域です。これは、静的領域の逆ですね。つまり「動的」な情報が格納されるわけです。つまり、ここには、作られたり消されたり、様々な動きが起きるんですね。
最後に、スタック領域です。ここは、スレッド制御のために使われます。じゃぁスレッドってなんなんだよ。ってことになります。
スレッドとは、コンピュータの実行単位の一つと言えば分かりやすいかもしれないですね。プロセスのような単位です。wikiはここですhttp://http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89_%28%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%29。まぁコレみても難しいんですので簡単に説明すると、例えばskypeというアプリケーションありますよね?しかし、skypeで友達を待っているとき、そのまま待っていてもつまらないので、webブラウザなどを立ち上げて、ウェブサーフィンなどをしたりしますよね(少なくとも僕はそうです)。そして、それらのスレッドは、skypeは、チャット送受信を行うスレッドだったり、ビデオチャットをするスレッドだったりがあります。また、webブラウザには、入力を受け付けてるスレッドだったりとにかく色々なものがあります。つまり、スレッドとは、このようなものの単位と考えてください。
したがって、スタック領域には、ローカル変数や、メソッドの引数などが、格納されることになります。

ハイ。追記です。(2010/12/26)
ええと、どこまでいったか忘れてしまいました。確か(上見ればいいんだがめんどくさい。)、3つの領域と、その使い方(オブジェクト指向プログラミング言語の)についてまででした(だったはず)。では今回はその先についてと、最後はobj-c2.0の新機能の一つガベージコレクションについて説明して今回の記事を終わらせたいと思います。
【オブジェクトの生成】
で、ここからガベージコレクションに話を飛ばすためには、この話をしなければならんのですね。オブジェクトはどこにどんな感じに生成されるのかを簡単に説明します。
オブジェクトが生成されるとき、このオブジェクトどこに格納されるのかな?っていうと、入ってきたり出て行ったりする場所。ヒープ領域に格納される訳です。ええ!?って僕は思ったんですが、(僕だけかもしれない)こんなことしたら、メモリが圧迫されそうですよね(このことをメモリリークといいます)。ですが、最近はPCの性能も上がりこんなことをしても大丈夫になったのです(まぁだからこそ昔は無かったのですね)。ただ、さすがに現在の市販の安いPCの場合こんなことばっかりずっとやってて、不要になったインスタンス消すのを忘れてると(メモリの解放ですね)、メモリリークされてきます。ここで登場するのが!ガベージコレクション(ゴミ集め)なんですね(ですね、ですねいいすぎですねいいかげんうざくなるかもしれないまぁ押さえといてください)。
【参照(ポインタ)】
そして、ガベージコレクションを理解するための最後の項目です。「ポインタ」、「ポインタ」、「ポインタ」...
ほんと、ポインタというと頭が真っ白なのか真っ黒なのか分からなくなったりしますが、まぁ実はそこまで難しくないので(今回は)大丈夫だと思われます。というより、参照という方がいいのではないでしょうかね。まぁポインタでよくある例は、「住所」を使って行う説明でしょうね。まぁでもそれはおいておいて、(これからは参照に統一します。あ、気まぐれでもしかするとポインタとか書くかもしれないですが)本題です。オブジェクトを生成するとき、変数に格納したりしますが、そんときに変数に格納されてるのが参照なんです。つまり、オブジェクトは参照しまくっているってことですね。んん。説明が下手なことを実感する。絵を描きたいんだが、この前の絵での疲労度がトラウマとなって書きたくない。後で、良い描画のフリーソフト取ってこなきゃ(というか考えてみると確かxcode内蔵のサンプルコードとして、描画ソフトが入ってるんだよな。あれでもいいか。多分使いにくかっただろうけど)。macなだけに、駄目です。こういうときのために自分でアプリを作れれば!

では暇だったら、今度絵を乗っけとくんで、今覚えるべくは「オブジェクトはお互いに参照し合っている」ということです。
【ガベージコレクション】
「オブジェクトは参照し合ってる」ということを、一つ前に書きました。これをしっかり覚えておいてくださいね。
オブジェクト指向プログラミング言語は、オブジェクトを生成するとそれをヒープ領域に格納すると書きました。そして、メモリリークを防ぐためには!ガベージコレクションとかいう変なのがあるってとこまで触れましたね。
「ガベージコレクション」を直訳すると、「ゴミ集め」です。つまり、メモリリークを防ぐためヒープ領域を無駄に使っている邪魔者を除去してくれるのです。実際では、プログラマがオブジェクトをヒープ領域から取り除く作業を行わなくても勝手に邪魔者とガベージコレクタ(ガベージコレクションを行うシステムのこと)が、勝手に取り除いてくれるという非常に便利なものです。

でもどうしてガベージコレクタは、ヒープ領域にあるたくさんのオブジェクトの中から、「ゴミ」を見つけられるのでしょう?
答えは、さっきまで強調していた「オブジェクトは参照し合っている」ということにあります。つまり、どのオブジェクトからも参照されなくなったオブジェクト、それは、「ゴミ」になります。一番最初参照するのは、外から(ヒープ領域外から)ヒープ領域内のオブジェクトを参照し、参照の手をどんどんつないでいきます。しかし、誰からも参照されなくなってしまった仲間はずれのオブジェクトは処分されてしまうのです。でも、それだけではありません。自分は参照しているけど、誰からも参照されていないオブジェクトも処分されます。さらに、二つもしくは複数くらいでループしているが、外からの参照は受けていないオブジェクトも処分されます。つまり、お互いに参照し合っているが、根本にたどることができない参照の手のつなぎの部分これも処分されます。

う~ん。長ったらしい上に、要点の分かりづらい文になってしまった。上の部分をまとめていうと、「参照し合っているオブジェクトのネットワークの中で自分の部分から根本にたどることのできないオブジェクトが処分の対象になる」ということです。コレも今度絵をのせますね。

@説明終了

長々失礼しました。
次回もよろしくお願いします

コンパイラ方式とインタプリタ方式それに中間言語方式

今回は書いたプログラムの実行の方法について、書いてみたいと思います。(結構話がそれていますが)

@説明開始
【概要】
Cなどの言語は、人間に分かりやすいようにされている言わば「高級言語」の部類に入る言語です。しかし、コンピュータは、Cで書けるようになったからといって、人間の言葉を少し理解したわけでは有りません。コンパイルをしますよね。gccとかそういうのです。それくらいは多分誰でも分かると思います。しかし、プログラムを実行する方法はコンパイルするだけではないんです。インタプリタ方式という方法があります。このインタプリタ方式というのは、人間に分かりやすいように書いてある高級言語を、コンパイルしながら実行しているんです。
                
これがインタプリタ方式の実態でしょうか?FC2の描画ソフト使って行ったので字が変ですね(汗)次回からはちゃんと現実世界で書きます...

【コンパイラ方式の長所短所】
この二つの方式はまさに一長一短なんですね。コンパイラ方式の長所としては、実行時の速さが挙げられます。まぁそりゃ当たり前ですね。機械語を実行しているのに他ならないのですから。
逆に、短所には、機械語に変換する手間がかかります。
【インタプリタ方式の長所短所】
基本的にコンパイラ方式の真逆ですね。実行するのに必要なステップを一回ですませる代わりに、コンパイルしながら実行しているわけで、実行効率が悪いんですね。じゃぁこんなの使わなくてよくね?ってことになってしまうんですが、この方式だとどんなOSの環境にも対応できるんですね。例えば、winPCで作ったプログラムを実行ファイルにしてmacに持ってくると使えない(はず)です。ただプログラムは同じなので、プログラムを持ってくればmacで使うことができます。macのアプリケーションがwinで使えないのと同じですね。

【中間言語を使う】
しかし、最近javaなどでは、中間言語を一度介してから、インタプリタ方式で実行するという方法が有ります。(obj-cにはないんじゃない?)これは、二つの方法のいいどこどりのようなものなんですね。(まぁ一度中間にコンパイルしなきゃいけないんだから完全にいいとこどりではないけど)この方式によって、実行効率はインタプリタより速く、しかし様々なOS環境に対応させることができるようになるんですね。

@説明終了

いつも、Cなどでなんとなく使っているコンパイラですが、ほかにも様々な方式(二つ)があることが分かりましたでしょうか?

まぁ知っている人がほとんどだとは思いますが、一応メモがてら更新しました。

なんでクラスなんてつくるの?

どうも。今回は、クラスにすると、大まかに何が便利なんだろう?ってことについて、書きたいと思います。
@説明開始

【クラスって何が便利なの?】
まぁ、みなさんもご存知のように、クラスを作ることによって解消される問題は、まず、複数の処理する内容(メソッド)と、複数の変数(インスタンス変数)をまとめることが挙げられます。
このようにすると、何が便利かな?って考えてみます。例えば、数年間によってたまったプリント(現在学生なので学生っぽい感じの表現です。ハイ。)、この中には様々な知識が詰まっていますね。しかし、数年すれば、その量はとんでもない数になっているはずです。この中から、知りたい内容を取ってくるのは、大変です。
しかし、いつに配られたプリントなのか?どのような種類のプリントなのか?のように分けていくと、だんだんその複数のファイルに分かれていきます。この中から、欲しい情報を取ってくるのは簡単だってことは、すぐに分かりますよね?
つまり、クラスに分けることで、整理整頓をしているということなのです。
さらに、クラス分けをすることの効能はこれだけではありません。クラスに分かれるということは、複数のクラスの中に、同じ名前のメソッドがあっても大丈夫ということも有ります。書類をフォルダ分けするとき、フォルダさえ違えば名前が同じでも大丈夫ということと同じですね。

また、クラスにすることによって、グローバル変数みたいだけどローカル変数のようでもある変数の作成(=インスタンス変数)を作ることができます。
グローバル変数は、プログラムが実行されてから、実行終了まで、存在するのですが、どこからでもアクセスできてしまうため、プログラムのその変数が変な動きをしたとき、片っ端からその原因について調べなくてはなりません。短いプログラムなら大丈夫ですが、長いプログラム(行数が万単位のような)になると、それを調べるのは本当に大変です。
ローカル変数は、小さな範囲からしかアクセスできないような変数です。しかし、その性質上プログラムで呼び出し時に作られた後抜けるときには、消えてしまいます。
つまり、インスタンス変数は、この両者の良いところのみをとった変数です。つまり、影響範囲は、選択したものに抑えますが、必要になるときから必要にならなくなるまで残り続けます。

最後のクラスの効能として、プログラミングの効率を上げるということが有ります。これは、必要なものをクラスにまとめておくことで、実行時に、複数のインスタンス作ることで、その分だけメソッドを呼び出すことができます。

このように、クラスを作ることによって、色々良いことが増えるわけです。
@説明終了

つまり、二度手間のようにも感じてしまうかもしれないクラスの作成はとても大事な作業なのです。

そもそも、obj-cってなんだ?

どうもこんにちは。小さなプログラマです。今日は、大きく原点に帰って、そもそもObj-cって何?ってとこまでにしようと思います。

@説明開始

【そもそもobj-cってなんだ?】
obj-cとか言ってる感じなんで、この言語はオブジェクト指向の言語です。じゃあオブジェクト指向ってなんだろう。もともと、オブジェクト指向の原点としては、simula67とかいうプログラミング言語なんですね。確か、コレかなり昔からある言語なんですが、あまりにも昔すぎて当時の人たちは、オブジェクト指向なんているか!って感じであんまり注目されてなかったそうです。現在でこそ、人気のオブジェクト指向言語。javaや、C++などもオブジェクト指向ですね。
それで、obj-cはどんなのかな?というと、Cをベースにした、Smalltalkに似た言語なんですな。ハイ。んまぁ詳しくは、wikiにあります。http://ja.wikipedia.org/wiki/Objective-C
obj-cは、ほとんどのC言語の関数とか制御文とかそういう系のやつを使うことができる(はず)です。だから、if文だとかfor文だとかそういうのも使えますし、printf関数もstdio.hをインポートすれば大丈夫ですね。
そうすると、C言語のように、それぞれのものの使い方についての勉強は、Cですましてある、と考えると、obj-c特有の部分のみを勉強すればいいわけです。
そして、それらのほとんどは、(たぶんだけど)オブジェクト指向の勉強といってもいいんだと思いますね。
appleは、objective-c2.0を作っていますし、これからもobj-cは、appleの手によって守られていくと思います。ちなみに、obj-c2.0によって変わったことは、ガベージコレクションとか、そういうのの導入があったりしますが、大してかわらないみたいなので、(知らないけど、まぁ書き方とか)obj-c2.0もobj-cと表記することにします。
まぁ、なのでこのブログは、結構オブジェクト指向関連の勉強になると言ってもいいですかねハイ。

@説明終了

んまぁそんな感じです。まぁ上の要点を言うと、コレから勉強するのは、オブジェクト指向ってなんだ?ってことってことを言っているんです。

では

obj-cに出てくる変な言葉4つをまとめてみました

ちょっと、obj-cに出てくる言葉をまとめてみました。
@説明開始

【メソッド】
メッセージによって、呼ばれたものを処理する知識のようなもの。
ある人が文房具屋で、鉛筆を一本下さい。と言ったとき、店頭に(そんなことはないだろうが)、一本も鉛筆が無かったので、倉庫から出してくる。これも、メソッド。
そして、倉庫から探す早い方法、これもメソッドです。

【抽象化】
例えば鉛筆を考えると、鉛筆の構成は木材と、鉛ですが、どこの会社の鉛筆なのか、その鉛筆はどのくらいの長さか、その鉛はどのくらいの硬さか、鉛のなかには、様々なその鉛筆が書きやすくなるための材料や、折れにくくなる材料が混ざっていたりする材料はなにか。
木材には、それが何と言う木か、それはどのくらい大きな木から作ったのか、それはどこで切ったのか。など様々なことが言えます。
しかし、鉛筆を買うときに必要な情報と言うと、どこの会社か。ということと、その鉛筆の硬さ、長さくらいではないでしょうか。
このような情報の中から必要な情報だけを取り出すことを抽象化といいます。

【オブジェクト】
オブジェクトを直訳すると、「もの」 です。obj-cの中でもそれは同じです。ものには属性があります。鉛筆で考えると、オブジェクトは、鉛筆。芯の硬さとか、その鉛筆の長さとかは、属性になります。
このオブジェクトは、obj-cでいうと、属性と処理(メソッド)をまとめたものにあたります。
では、属性はなんなんでしょうか?結論から言うとこの属性こそがインスタンス変数にあたります。変数ということは、なにかを格納する場所つまりメモリのある一部であるといことが分かります。(ポインタということですね。)
【クラス】
じゃぁクラスってなんなんでしょうか?メソッドとインスタンス変数をまとめているのが、オブジェクトなら、クラスはどういうものを表す言葉なのか。これは、ちょっと僕としては説明するのが難しいのですが、オブジェクトの原点だと考えています。
つまり、複数のオブジェクトはそれぞれ違うものです。(同じものなら一つになりますからね)でも、それぞれに必要なメソッドや、インスタンス変数がちょっとずつ重なっている場合がある場合があると、オブジェクトの原点の「クラス」のなかにあるメソッドを持ってきて、それを使って新しいオブジェクトを作ったりできます。そして、もう一つ別のオブジェクトを作るときにも、おんなじ「クラス」の中にある、同じメソッドを使って作ることもできるということです。

@説明終了

今日はここら辺で。また今度コレ以外の言葉を説明しますね。

クラスの作成

はい、で早速なんですが、まぁちょっと更新を。

【Objective-Cのだいたいの書き方】
objective-cでは(これからはobj-cで)、クラスを作成するとき、インターフェース部、実装部の二つに分けて作成します。

◎インターフェス部
@interface~@endまでの中に、クラス名の宣言、スーパークラスの宣言、インスタンス変数の宣言、それにメソッドの宣言を行います(もっと有ると思うけど最初はこんくらいで)。クラスの名前は好きに決められます。(ほかのクラスなどと重ならない限り。)
スーパークラスは、今から作るクラスの親玉みたいなものです。つまり、今から作るクラスは、スーパークラスの宣言で宣言したクラスの特性(メソッドとか、インスタンス変数とか)を、そのまま、「継承」することができるんですね。便利です。
最初は、継承するもの無いじゃないか!という感じなんですが、この一番最初に存在するクラスというのが、Objective-Cにはあるんですね。「NSObject」というクラスで、obj-cがちゃんと動くのは、こいつのおかげなんです。あ、ちなみに、このNSObjectというクラスをrootクラスと言って、一番偉いクラスなんですね(rootユーザとかありますよね)。このrootクラスは、ほかにもあるんですが、ここでは触れません(というより分かりません(笑))。

・インターフェース部の書き方
@interface 今から作るクラス名 : スーパークラス
{
インスタンス変数の宣言;
}
メソッドの宣言;
  〃;
.....

@end

また、このメソッドの宣言の部分は、インスタンスメソッドとかいうのの場合は「-」(マイナス)記号をつけるんですね。クラスメソッドの場合は「+」(プラス)を。

◎実装部の書き方
@implementation~@endの間に先ほどのインターフェース部で宣言したクラスのメソッドに実装していくんですね。ハイ。

@implementation 実装するクラス名
{

  メソッドの実装

}
@end

ここにひたすらメソッドを実装していきます。

さぁこれでクラスの作り方は終了。なんですが、作っただけでどうする!ってことですよね。

そこでCでもおなじみのmain関数の登場です。

ただ、obj-CとCが大きく違う点が一つあります。[]でくくったのが、配列かそれとも「メッセージ式」というものなのか。という違いです。

・メッセージ式
メッセージ式とは、オブジェクトをどのように実行させるか、クラスのメソッドに聞きにいくものです。例えば、
objというオブジェクトに、ugokiという宣言をするには
[obj ugoki]
のように宣言します(あー説明下手だ)。

・main関数
そして、main関数にて今まで作ってきたクラスをメッセージ動かさせます。


@説明終了です。

【雑談】

ほんとまだ完璧な理解をしていないだけあって説明下手ですね。ハイ。

ただ、Cさえ理解していれば、基本的にメソッドの実装などは、Cで書くので(配列とかをのぞくと)、if文とかばりばりで使えます。

つまり、クラスの書き方とか、オブジェクト指向によって出てくる多々の概念を覚えることができれば、結構それなりに書くことができる(はず)。しかし、やはり、難しいんですね。(特に僕には)

毎日の更新は難しいでしょうが、これからも更新していこうと思っています。よろしく

はじめまして

どうもはじめまして!

小さなプログラマです。ハイ。

んまぁmacユーザです。

Cもままならないんですが、頑張ってみようと思ってますんでよろしく。

2011年の1月6日には、とうとうmac app storeもはじまり、まぁそれに投稿するには、結構多額なお金(個人で考えると)を払わなくてはならないんでまだまだできませんが、いつかは投稿してみたいものだと思ってたり思ってたり。

そんな感じですんでよろしく。
プロフィール

小さなプログラマ

Author:小さなプログラマ
小さなプログラマです。

これはあくまで、「勉強ログ」なので間違っている場合が多々あります。

なので、このブログに書いてあることは、8%くらいの信じ度でお願いします。

間違っているじゃないか!と言われてもあれなので。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
メールフォーム

名前:
メール:
件名:
本文:

カテゴリ
カウンター
検索フォーム
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。