Objective-C/iPhoneアプリ開発開始


Javaを約2週間ほど勉強していたのですが、今週からはいよいよiPhoneアプリの作成を目指して、Objective-Cの勉強を始めました!
というわけで、今回のブログでは、自分自信が戸惑ってしまったところをメモがてらにupしつつ、「JavaObjective-Cの違い」について書いていきたいと思います。

ちなみに、使用している教科書は、詳解 Objective-C 2.0と、iPhone SDKの教科書―Cocoa Touchプログラミング、最初の一歩

                                                                                                                                      • -

クラスの宣言

*ファイルをヘッダファイル(クラス名.h)と実装部(クラス名.m)に分ける

ヘッダ部の宣言(インタフェース部)

@interface クラス名 : スーパークラス名 {
   インスタンス変数の宣言;
   ・・・
}
メソッドの宣言;
・・・
@end

インスタンス変数とは、Javaでいうフィールド。
スーパークラス名は必ず書かねばならない。(NSObjectを継承する場合も)
*メソッドの定義方法については後述

Javaのときのinterfaceと違う使い方をしているので、始めの方は大分混乱しました。

実装部の宣言

@implementation クラス名
メソッドの定義
・・・
@end

メソッドの宣言

  • (返り値) メソッド名:(引数の型)引数名 引数パラメータ:(引数の型)引数名

*引数パラメータに大分混乱しました。今でも時々「?」ってなってしまいますが、iPhoneアプリを実際に作っていきながら覚えるしかなさそうです。

インスタンス生成

[[クラス名 alloc] init];

alloc
→メモリ上に必要な領域を確保する
init
Javaでいうコンストラク

protcol

Javaでいうinterfaceは、

@protocol プロトル名
メソッド宣言;
・・・
@end

という形で宣言。


protocolを実装するときは、スーパークラス名の後に、<プロトコル名>を付けます。

@interface クラス名 : スーパークラス名 <プロトコル名> {
   インスタンス変数の宣言;
   ・・・
}
メソッドの宣言;
・・・
@end

メモリ管理

Javaにはガーベッジコレクションがあるので、意識はあまりしなくてもよかったのですが、Objective-Cには、ガーベッジコレクションがないので、絶対に外せない項目。
今までのまとめは、Javaのときと宣言方法が違うだけなので、慣れれば問題ないと思いますが、メモリ管理は意識してコードを書いていかねばならぬようです。

インスタンス作成時に、retainCount(参照) が+1され、また、他のインスタンスで、参照されるとretainCountが+1される。
また、もうインスタンスを使用しなくなった時点で、releaseメソッドを使用し、retainCountを−1し、最終的にdeallocメソッドを呼び出し、メモリ上に確保されている領域を解放してあげるという一連の流れについては、正直なところ、まだまだ慣れておりません。。。

しかし、メモリ管理をしっかり行わなければ、メモリリークしてアプリが落ちてしまい、ユーザー様にご迷惑をおかけしてしまうことになるので、本腰入れて勉強し直します。
また、別エントリーでメモリ管理に関するものをupしたいと思います。

メモリ管理勉強時に行った、文字列のメモリ管理についてです。
*詳しくは後日upいたします。

        //release必要なしretainCountでは、Integer型の最大値が表示される
	NSString *letter1 = @"itabashi";
	NSString *letter2 = [[NSString alloc] initWithString:@"itabashi"];
	NSString *letter3 = [NSString stringWithString:@"itabashi"];
	
	//releas必要
 	NSString *letter4 = [[NSString alloc] initWithFormat:@"名前:%@",@"itabashi"];
	NSMutableString *letter5 = [[NSMutableString alloc] initWithString:@"eeee"];
	
	//retainCountを出力
	NSLog(@"%d",[letter1 retainCount]);
	NSLog(@"%d",[letter2 retainCount]);
	NSLog(@"%d",[letter3 retainCount]);
	NSLog(@"%d",[letter4 retainCount]);
	NSLog(@"%d",[letter5 retainCount]);
	
	//releaseのテスト
	[letter4 retain];
	NSLog(@"%d",[letter4 retainCount]);
	[letter4 release];
	NSLog(@"%d",[letter4 retainCount]);

ポインタという概念(C言語

Javaでいう参照型のことです。
始め本で「ポインタ」という言葉がでてきたので、C系の勉強をしていない方はこちらをご参照ください。
さっくりしててわかりやすかったです。

ポインタについて(変数)

ポインタについて(配列)

                                                                                                                                      • -

とりあえずこんな感じです。
propertyやメモリ管理の詳細については、長くなってしまうので別エントリーでアップしたいと思います。とりあえず、↑がJavaとの大きな違いだったかなと個人的には感じています。



話題は変わりますが、Foursquareが国際宇宙ステーションからCheck-inを行ったとのこと。
最近、宇宙兄弟(1) (モーニングKC)にはまっているので、ものすごくワクワクしてしまいました。死ぬまでに一度は宇宙に行ってみたい!