allocとinit
今日のはてな
UIImageView *view = [[UIImageView alloc] initWithImage:image];
このちょくちょく出てくるallocとinitとはなんぞや?
ではさっそく調べてみましょう。
【alloc】
allocateの略。
allocateは「割り当てる」という意味の単語。
allocはメソッド(動詞・指示)です。
何をするメソッドかというとインスタンス化を行うメソッドです。
(by: http://www.objectivec-iphone.com/introduction/method/class.html)
【init】
Initializeの略。
Initializeは「初期化する」という意味の単語。
Initial(イニシャル)は「最初の」っていう意味とかあるもんね。ふむ。
またinitもメソッド(動詞・指示)です。
役割はそのまんま、初期化をするメソッド!なんだ簡単!
が、しかし。
単語の意味が分かっても文法がよくわかんない!ってことで、さらに調べていきます。
もともとの手順はこんな流れらしい。
1)変数を宣言 → クラス名 = * 変数
2)インスタンスの生成 → 変数 = [クラス名 alloc];
3)インスタンスの初期化 → 変数 = [インスタンス init];
例)
1) NSDate = *today
2) today = [NSDate alloc];
3) today = [today init];
で、こんな3つも書かなきゃいけないのはめんどくさい!
が、なんと2)と3)は実は短縮できるだとさ!
2も3も [ ] がついてるよね。
この [ ] 入れ子にすることが出来るんだって!つまり…
短縮系)インスタンスの生成と初期化 → [[オブジェクト メソッド1] メソッド2];
例) today = [[NSDate alloc] init];
2と3が一行で済んじゃった。
3のインスタンス部分に2の生成式を代入する感じかね!
(by: http://www.olein.net/study/20120719160000/)
つまり、はてな発生の時点で私はこの短縮系を見せられたと。
しかもさらになんかごちゃごちゃついてるものを!
そりゃあ訳わかんないよ〜。
さらに、どうやらこのプロセスには元々newというメソッドが使われていたそうです。
でもそれだと細かな設定が出来なかったり、色々不都合があったので上記のallocとinitに分けて使われるようになったそうな。
(by: http://stackoverflow.com/questions/719877/use-of-alloc-init-instead-of-new)
なるほど。元々ひとつのメソッドだったのでallocとinitはセット!双子!
ひよこの私的には
なんでインスタンスは初期化しないといけないの?
なんか不都合があるの?
とか、さらなるハテナが浮かんできますが今日はタイムアウトなのでここまで。(毎回なんですが、謎が謎を呼ぶこの勉強。。。)
また時間があったら調べてみることにします。