Mac初心者のiPhoneアプリ開発記4 Objective-Cの復讐

objective-c42

前回から10日もたってしまい、ほとんど忘れてる状態からの再開です。今回も引き続きObjective-Cの勉強ですが、徐々に難易度が上がっている気が。(・_・;)

前回は、Xcodeでアプリ開発を始めたもののソースが理解できずに挫折、それではとObjective-Cの勉強を始めました。勉強は@ITの連載「Cocoaの素、Objective-Cを知ろう」に沿って行い、前回は第3回まで進めました。

この連載は全8回ありますが、今回は残りの5回分を一気に疾走します。おそらく本当はもっと時間をかけて身に付けるべき内容。新しい情報が洪水のように押し寄せるので、全てを一度に記憶するのは無理。しかしソースだけはしっかり読んで理解しながら進みました。

最後まで連載を読んで思ったのは、この連載はObjective-Cの全体が網羅できるよう緻密に考えられた素晴らしい内容でした。今後スキルが上がっても、きっと再び読みに戻ることになりそうです。

 

前回までの復習

前回までの要点をまとめました。特に「オブジェクト」と「インスタンス」の言葉の使い方が?でしたが、ほぼ同義で使われているようです。

第1回
Objective-Cは特殊な言語? – @IT
@で始まる記述は
コンパイラディレクティブ
[と]で囲まれた部分
メッセージ式のオブジェクトメソッド呼び出し
id型とは
汎用的な共通のデータ型
第2回
一番初めのObjective-Cプログラム – @IT
クラスの宣言と実装法
@interface MyClass : NSObject {
}
- (void)myMethod;
@end

//クラスの実装
@implementation MyClass
- (void)myMethod {
    printf("Hello World.\n");
}
@end

※特に具体的なスーパークラスの想定がない場合は NSObject をスーパークラスとする。

第3回
Objective-Cのクラス定義を理解しよう – @IT
メンバ変数について
Objective-Cのメンバ変数は基本的にすべてインスタンス変数。
メソッド定義時の先頭の-は?
インスタンスメソッド。通常はこれ。クラスのインスタンスがあって初めて実行できるメソッド。もし+をつけたらクラスメソッド。インスタンスがなくても実行できる。やや特殊な用途に使う。

protected,privateなメンバ変数のことをプロパティと呼び、 プロパティにアクセスするメソッドをアクセサ(セッター&ゲッターメソッド)と呼ぶ。 アクセサは@propertyと@synthesizeで自動作成できる。

@property (retain, readonly) NSString *myStr;
@synthesize myStr;
言葉の定義

オブジェクトという言葉はインスタンスとほぼ同義に使われる。 クラスはオブジェクトの設計図で、それを元にメモリにロードされた実体がインスタンス。インスタンス = 実体。

クラスオブジェクト = クラスのオブジェクト = (何クラスか不明な)インスタンス

 

第4回 変数について

ここから今回の内容。プログラミングの基本、変数です。PHPやJavaScriptに慣れているとCの変数の定義は厳密で、やや面倒に感じます。

ここでは変数とオブジェクトの違い、そしてオブジェクトでデータを管理する利点などを把握しておきたい所。文字列クラスのメソッドは「こんな事ができる」と覚えておいて、使い方は必要になった時に調べれば良いと思う。

第4回

変数のデータ型や文字列の扱いを理解しよう - @IT

ラッパークラス
変数をオブジェクトとして扱う必要があるときに使う。
NSNumber *wrappedDouble = [NSNumber numberWithDouble:0.333];
文字列クラス
NSString *str01 = @"あいうえお";
データが可変する場合はMutableというクラス名を使う
NSString → NSMutableString

 

第5回 配列とループ

第5回は配列とループの勉強です。変数と同じくプログラミングの基礎。他の言語の経験者なら把握しやすい回です。

NSStringと同じように、配列クラスでは何が出来るかを把握しておくこと。メソッドの記述法まで憶えておく必要はない。配列クラスで扱うデータはオブジェクトである必要があるので、前回でラッパークラスを勉強したというのが分かる。

第5回

配列とループ処理を理解しよう - @IT

配列と連想配列のクラス
配列クラス
  • NSArray
  • NSMutableArray
連想配列クラス
  • NSDictionary
  • NSMutableDictionary
オブジェクトの内容を出力できる NSLog
NSLog(@"array : %@\n", array);
ループ3つ
  • forループ
  • 列挙子を使ったループ
  • 高速列挙を使ったループ

高速列挙プロトコルを採用しているクラスなら使える。プロトコルは第6回でやる。

 

第6回 オブジェクト指向を掘り下げる

オブジェクト指向プログラミングを確認する記事です。第2回で作った「♪ La La La … ♪」と歌うコードのように、この記事でも親兄弟といったサンプルで、クラスの継承などの特徴を復習できる。オブジェクト指向が不確かな場合、ここで立ち止まり理解する。後半のクラスクラスタやカテゴライズは、そういうものだと理解。

第6回

コードをもっとオブジェクティブに - @IT

プロトコル
複数のクラスで同名のメソッドを作る仕組み。クラス間で共通の約束事。
@protocol Zukei
- (void) draw; // drawメソッド必須
@end

@interface Maru : NSObject <Zukei> // 採用したら絶対実装する
@end
@implementation Maru
- (void) draw { printf("○\n"); } 
@end
プロトコルの継承
@protocol ProtocolB <ProtocolA>

プロトコルは継承もできる。継承したすべてのプロトコルの約束を守る必要がある。

オブジェクトの判定方法
そのオブジェクトが属するクラスやプロトコル、実装しているメソッドなどを判定するメソッドが用意されている。
  • isMemberOfClass
  • isKindOfClass
クラスクラスタ
あるクラスのオブジェクトを作成した時に、内部で違うクラスのオブジェクトが作られる仕組みのこと。クラス設計者にしか分かり得ないから通常は意識する必要はないが、クラスの型で判定する場合に注意。
クラスのカテゴライズ
人間用のクラスの管理術。()でカテゴリー化して把握しやすくする。プロジェクトが肥大化した時に。
@interface Chef (Japanese)
@implementation Chef (Japanese)

 

第7回 メモリ管理 前編

前後編の2回に渡りメモリ管理。これもWEB系言語なら意識しなくていい。ガベージコレクションという自動メモリ管理はiOSでは使えないので勉強する必要がある。参照カウンタを使った仕組みを把握すること。特に2ページ目のソースはややこしいが食らいついて理解する

第7回

メモリ管理を理解する(前編) - @IT

参照カウンタ
そのオブジェクトが必要かどうかのカウンタ。必要なくなったらリリースする。
参照カウンタを増やすretain
参照カウンタを減らすrelease

第3回で勉強したセッターメソッド時にretainしてカウントすること。実はアクセサ自動作成の時にも勉強している。

@property (retain, readonly) NSString *myStr;
クラスのインスタンス変数の解放
releaseされた時に参照カウンタが0ならdeallocメソッドが自動的に呼び出される。deallocをオーバーライドしてインスタンス変数を解放すること。

 

第8回 メモリ管理 後編

メモリ管理の責任範囲について。大きなプロジェクトとなるとメモリ管理が行き届かなくなるので、メモリの責任範囲を知って解放を忘れないようにする。autoreleaseは必須知識。2ページ目のガベージコレクションはiPhoneアプリでは利用できないのでななめ読み。OS Xアプリを開発する時は使えると覚えとく。

第8回

メモリ管理を理解する(後編) - @IT

半自動メモリ管理 autorelease
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pool drain];

オブジェクト作成時にautoreleaseを実行しておくと、一時メモリ領域(pool)に入ってdrainで一気にリリースできる。 多くのクラスで利用でき、クラスは初期化のみとalloc→init→autorelease込みの2つのメソッドを用意している。

  • initWithCString:encoding:
  • stringWithCString:encoding:
initWith~初期化メソッド
xxxWith~インスタンス生成メソッド(xxxはstring等)

 

今回はObjective-Cの基礎を駆け抜けたので、まさに勉強という感じでした。分からないソースを追うのは大変ですが、最初はさっぱり分からなかったObjective-Cのソースにも慣れてきました。

次回は挫折したままとなっている、@ITの連載「SDKで始めるiPad/iPhoneアプリ開発の勘所」の第4回、iOS 4のSDKで、Twitterを使ったiPhoneアプリを作るにもう一度トライします。Xcodeに戻れるので楽しみです。(・∀・)

この連載の一覧

  1. Mac初心者のiPhoneアプリ開発記

    この記事は先日購入したMacBook Air(略してMBA)でiPhoneアプリ...

  2. Mac初心者のiPhoneアプリ開発記2 Xcodeの闇の中で

    iPhoneアプリ開発するぞ!と意気込んでMBAを購入したのは1年前。でもAnd...

  3. Mac初心者のiPhoneアプリ開発記3 Objective-Cの壁

    手探りで進めているiPhoneアプリ開発記。前回は@ITの記事を参考に、Xcod...

  4. Mac初心者のiPhoneアプリ開発記4 Objective-Cの復讐

    前回から10日もたってしまい、ほとんど忘れてる状態からの再開です。今回も引き続き...

  5. Mac初心者のiPhoneアプリ開発記5 因縁のTwitterビューア

    今回は難しくて挫折していた「iOS 4のSDKで、Twitterを使ったiPho...

  6. Mac初心者のiPhoneアプリ開発記6 画像処理はじめました

    前回から随分時間が経ってしまいました。iPhoneアプリ市場は激戦なので、果たし...

  7. Mac初心者のiPhoneアプリ開発記7 設定画面を作る

    今回はツール系アプリなら装備しておきたい、いわゆる設定画面を作ります。今後アプリ...

  8. iOSの進化とフラットデザイン

    iKuracさんが作成したiOSの比較画像。先日発表されたiOS7のデザインの路...

  9. Mac初心者のiPhoneアプリ開発記8 設定画面を動的に作る

    前回は設定画面を作るためにストーリーボードやTableViewの仕組みを勉強しま...

  10. Mac初心者のiPhoneアプリ開発記9 アプリ申請までの道

    ようやく!初のiPhoneアプリ申請までたどり着きました。名前は『Screens...

  11. Mac初心者のiPhoneアプリ開発記 リリース後の反応

    実は先日8/9に『Screenshot Maker Pro』がリリースしました。...

  12. 大人センスなiPhone壁紙『A new world』

    NYで活躍中のドイツ人デザイナーTobias van Schneiderさんの作...

  13. ReynoldsさんのiPhone壁紙

    渋い色調のポリゴン地形がお洒落。Timothy J. Reynoldsさんの作品...

  14. シンプルの美学アンソニーさんのiPhone壁紙

    Anthony Zinonosさんの壁紙。青と黒、シンプルに色分けされた海上にオ...

  15. iPhoneアプリ開発記 iOS7対応で必要だったこと

    公開中のiPhoneアプリ『Screenshot Maker Pro』をiOS7...

  16. Cocos2d-xでiPhone&Androidアプリ開発記1

    そろそろ次のアプリ開発と日々考えていたんですが、私は個人開発なので今後は小粒なゲ...

  17. Cocos2d-xでiPhone&Androidアプリ開発記2 バージョン3.x系挫折

    『ドラゴンクエストモンスターズ スーパーライト』がCocos2d-xで開発とのこ...

  18. Cocos2d-xでiPhone&Androidアプリ開発記3 初心者TIPS

    今回で3回目のCocos2d-x連載。自作アプリを製作中ですが7割ほど完成してき...

  19. Cocos2d-xでiPhone&Androidアプリ開発記4 AdMobメディエーションでAdMob+iAd iOS編

    Cocos2dxで広告を表示するにはiOSとAndroid別々に設定が必要です。...

  20. Cocos2d-xでiPhone&Androidアプリ開発記5 AdMob Android編

    iOSに続きAndroidにAdmodを導入します。とりあえずAdModだけ表示...

  21. Cocos2d-xでiPhone&Androidアプリ開発記6 Android対応

    Androidアプリ開発経験は全くない状態で始めたCocos2dx。ここまでの開...

  22. Cocos2d-xでiPhone&Androidアプリ開発記7 ローカライズとアイコン組み込み

    ようやく初めてのcocos2dxアプリが完成しました! アルファベットを組み合わ...

  23. Cocos2d-xでiPhone&Androidアプリ開発記8 開発の流れとアプリ申請

    Cocos2d-xで初めてのアプリを公開しました。AndroidとiPhone両...

  24. Cocos2d-xでiPhone&Androidアプリ開発記9 SQLiteの注意点

    Cocos2d-xからSQLiteを使うには、iOSとAndroidそれぞれにラ...

  25. Cocos2d-xでiPhone&Androidアプリ開発記10 アプリ高速化

    Cocos2d-xで2本目をリリースしました。前回の英語パズルの続編『英単語ギズ...

  26. Cocos2d-xでiPhone&Androidアプリ開発記11 Androidのデバッグ

    Cocos2d-xによるアプリの新作をほぼ作り終えました。開発はXCode主体で...

  27. iOS/Androidアプリ『英単語RPG ワード・オブ・ザ・リング』

    iPhone/Androidアプリ『英単語RPG ワード・オブ・ザ・リング』を公...

  28. 人にも読めるQRコード

    人にも読めるQRコード『Human Readable Quick Respons...

  29. Xcode7にiOS 8 Simulatorがインストールできない

    Xcode 7.0.1に、iOS 8.1 Simulatorをインストールしよう...

 

 

広告