2011年4月28日木曜日

objective-C メモ1・クラスの宣言と定義

Objective-Cについてのメモです。言語についての解説ではありません。
本やサイトを読むだけではなかなか覚えることができないので、書いて覚えようと思います。後から思い出すきっかけになれば良いだけなので、トピックだけを抽出してまとめます。Objective-Cの基本となる言語はC言語のようですが、Cは知っているのでそれ以外についてのみ書きます。
Objective-C

・コンパイラディレクティブによって、オブジェクト指向部分を拡張しています。・Cに比べて多少言語拡張されています。例えば、for 〜 in などのコレクションへのアクセスなど。

基本
  • 文字列には、先頭に@を付加します。@”メッセージ!”
  • フォーマット指定子は、基本、C言語と同じで以下が拡張されています。
    %@=オブジェクトの内容

インポート 
#import <ヘッダファイル>
#import "ヘッダファイル"

クラスの宣言と定義 
@interface で始まり @end で終わります。
@interface クラス名 : 親クラス名
{
 インスタンス変数宣言
 ...
}
メソッド宣言
@end

メソッドとインスタンス 
クラスのメソッドは、インスタンスメソッドとクラスメソッドの2つがあります。

■インスタンスメソッド : インスタンスに対して実行するメソッドです。

メソッドの宣言
 - (戻り値型) メソッド名 : 仮引数リスト ... ;
※- 記号のメソッドをインスタンスメソッドと呼び、+ 記号で始まるメソッドをクラスメソッドと呼びます
例)
@interface Test : Object
- (void)method;
@end
 
インスタンスメソッドの実行
 [インスタンス メッセージ]
 例)
 [myself name] 
 
■クラスメソッド : 特定のインスタンスに依存しないメソッド
 
クラスメソッドの実行
 [クラス名 メッセージ]
 例)
 str = [NSString alloc]; 
 
 例) メソッドの戻り値がオブジェクトの場合は、複数のメソッドを続けて実行することができます。
 生成と初期化を連続して実行する例。 
  str = [[NSString alloc] init];
 
■インスタンス変数の宣言 (C++のクラスポインタ宣言と同じですね)
 クラス名 *変数名; 
 例)
 NSDate *date;
 
■インスタンスの生成
 変数 = [クラス名 alloc];
 allocメソッドは、インスタンス変数を初期化します。 
例)
 date = [NSDate alloc]; 

■クラスに応じた初期化メソッド init
例)
 date = [date init];
 
↓ 1行で実行
 
 date = [[NSDate alloc] init];
 
↓ newメソッドを使用する。
 
 date = [NSDate new]; 
 
■汎用データ型 id ※コンパイル時に型チェックされません。
 
id date;
date = [[NSDate alloc] init]; 
 
■インスタンスの開放は、release メソッドを使う。
 
[data release];
 
・自動開放の指定は、生成時に autorelease メソッドを使う。この自動開放の仕組みは NSAutoreleasePoolクラスによって実現されている。
テンプレートからプログラムを作成することで、この開放処理記述は省略できる。
また、この自動開放が組み込まれた標準クラス・メソッドもある。
例)
 name = [NSString stringWithString:@"Masayuki"]; 
 
クラスの定義 
@implementation コンパイラディレクティブを用いてクラスを定義しなければなりません。

@implementation クラス名
メソッド定義
...
@end 
  
<基本的なクラス定義のSample> 
#import <stdio.h>
#import <objc/Object.h>

@interface Test : Object
- (void)method;
@end

@implementation Test
- (void)method {
 printf("テスト\n");
}
@end
 
/* 
 main 
*/
int main() {
 id obj = [Test alloc];  // インスタンス化
 [obj method];  // method呼び出し   
 return 0;
} 
 

1 件のコメント:

  1. []の構文が 日本語的ですね。[Test alloc]=Testをallocする。なんとなぁ~く 逆?っていう印象があります。

    返信削除