Objective-C A Primer

Objective C は ANSI C のスーパーセット。ヘッダファイルとソースファイルに記述する。

.hヘッダファイル。クラスや型、関数、定数を宣言する。
.mソースファイル。関数定義を書く。

ヘッダファイルを読み込むには #import を使う。#import は #include と似ているが、同じものを二度読み込まない点が異なる。

#import <header.h>

Classes

  • クラスは、データとそれに対する操作をカプセル化したもの。
  • クラスのデータは「インスタンス変数」に保存される。
  • 操作は「メソッド」として実装される。
  • インスタンス変数は通常外部からは隠蔽されており、メソッドを通してのみアクセスできる。
  • プログラム実行時に、クラスを設計図としてメモリ上に展開されるオブジェクトを「インスタンス」という。
  • Objective-C では、クラスもインスタンスも共に「オブジェクト」として扱う。

クラスの記述

クラスを記述する際には、インタフェース部とインプリメンテーション部の二つに分けて行う。通常インタフェース部は .h ファイルに、インプリメンテーション部は .m ファイルに記述する。

以下はインタフェース部の例:

@interface MyClass : NSObject
{
   int count;
   id data;
   NSString *name;
}
- (id)initWithString:(NSString*)aName;
+ (MyClass*)createMyClassWithString:(NSString*)aName;
@end

インプリメンテーション部の例:

@implementation MyClass
 
- (id)initWithString:(NSString *)aName
{
    self = [super init];
    if (self) {
        name = [aName copy];
    }
    return self;
}
 
+ (MyClass *)createMyClassWithString: (NSString *)aName
{
    return [[[self alloc] initWithString:aName] autorelease];
}
@end

self は自分自身を、super はひとつ上位のオブジェクトを示す特別な変数。

メッセージ式

オブジェクトを操作するにはメソッドを呼び出す等する必要があるが、そのためには「メッセージ」を送る。そのために「メッセージ式」を使う。

[receiver message]
[receiver message:argument]
[receiver message:arg1 andArg:arg2]

用語:メッセージ式、メッセージ、セレクタ、メソッド

例:sayHelloとメッセージを送ると、Helloと言い、言った回数を数えておくクラス。

#import <Foundation/Foundation.h>

@interface Test : NSObject
{
	int counter;
}

-(id)sayHello;
-(id)sayHello:(int)n;
-(void)howManyHello;

@end

@implementation Test

-(id)sayHello {
	printf("Hello\n");
	++counter;
	return self;
}

-(id)sayHello:(int)n {
	int i;
	for(i=0;i<n;++i){
		[self sayHello];
	}
	return self;
}

-(void)howManyHello {
	printf("I said %d time(s).\n", counter);
}

@end


int main (int argc, const char * argv[]) {
	id obj=[[Test alloc] init];
	
	[obj sayHello];
	[obj sayHello];
	[obj sayHello:10];

	[obj howManyHello];
	
    return 0;
}

プロパティ

プロパティはインスタンス変数を参照したり、更新するためのメソッドを手軽に用意するための仕組み。

@interface Test:NSObject
{
   int counter;
}
@property int counter;
@end
@implementation Test
@synthesize counter;
@end

このように定義すると、以下のように使える。

Test *obj;
....
[obj counter]; // counter の値参照
[obj setCounter:20]; // counter の値更新

課題

  1. 2x2行列を表すクラスを作る。和、差、積が計算できる。
  2. 「人間」を表すクラスを作る。属性として、年齢、性別、氏名を持つ。年齢、性別、氏名が設定できるように。「人間」のサブクラスとして、「日本人」を作る。greeting というメッセージを送ると「私の名前は○○です。○歳の男/女です」と表示する。また「アメリカ人」を作り、greeting を送ると「My name is...」と表示するようにする。
  3. 長方形を表すクラスを作る。左上と右下の座標を保持し、以下のメソッドを持つ。
    1. 座標を設定して初期化する
    2. 座標を印字する
    3. 拡大する
    4. 移動する
    5. 別の長方形との交差部分で自分自身を更新する

文献


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-05-26 (木) 12:44:22 (2951d)