1. Objective-C は特殊な言語

最初のコードから

We use two files on this program:

--------------
1. objc.m
2. GNUmakefile
--------------
  1. objc.m
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#import <Foundation/Foundation.h> // for Objectiv-C
#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>

#import <stdio.h> // for C, there is no need to include this head file

// クラスの宣言
@interface MyTestClass : NSObject{
  NSString *myTestString;
}

- (void) setMyTestString : (NSString *)testString;
- (void) printMyTestString;

@end

// クラスの実装
@implementation MyTestClass : NSObject

- (void) setMyTestString : (NSString *)testString{
  myTestString = testString;
}

- (void) printMyTestString{
  printf("myTestString is %s\n", [myTestString UTF8String]);
}

@end

// 実行プログラム
int main(int argc, char *argv[]){
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  
  id obj1;
  obj1 = [[MyTestClass alloc] init];
  
  [obj1 setMyTestString:@"Objective-C, 我来自中国, from obj1"];
  [obj1 printMyTestString];

  [obj1 setMyTestString:@"Objective-C, 我來自中國, form obj1"];
  [obj1 printMyTestString];

  [obj1 setMyTestString:@"Objective-C, 私は中国から来ました, from obj1"];
  [obj1 printMyTestString];

  printf("\n");


  MyTestClass *obj2;
  obj2 = [MyTestClass alloc];
  obj2 = [obj2 init];

  [obj2 setMyTestString:@"Objective-C, 我来自中国, from obj2"];
  [obj2 printMyTestString];

  [obj2 setMyTestString:@"Objective-C, 我來自中國, form obj2"];
  [obj2 printMyTestString];

  [obj2 setMyTestString:@"Objective-C, 私は中国から来ました, from obj2"];
  [obj2 printMyTestString];

  [pool drain];
  
  return 0;
}
  1. GNUmakefile
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
.SUFFIXES: .o .m
.m.o:
	$(CC) -c $(CFLAGS) $<

PROG = objc
CC = gcc
CFLAGS = -g -Wall
FRAMEWORKS = -framework Foundation
SRC = objc.m
OBJ = objc.o

hist: $(OBJ)
	$(CC) $(CFLAGS) -o $(PROG) $(OBJ) $(FRAMEWORKS)

.PHONY: clean
clean:
	$(RM) $(PROG) $(OBJ) *~ a.out

objc.o: objc.m

objc.m の実行結果は:

[wtopia 1]$ ./objc
myTestString is Objective-C, 我来自中国, from obj1
myTestString is Objective-C, 我來自中國, form obj1
myTestString is Objective-C, 私は中国から来ました, from obj1

myTestString is Objective-C, 我来自中国, from obj2
myTestString is Objective-C, 我來自中國, form obj2
myTestString is Objective-C, 私は中国から来ました, from obj2

[@] について

@interface, @implementation には, @ で始まる記述が用意されている. これをコンパイラディレクティブと呼ぶ.

クラスの記述と実装

Objective-C 言語では, クラスの宣言と実装は分けて記述する:

@interface ではクラスを宣言し, そのクラスがどんな変数やメソッドを保存しているかを示す.
@implementation ではメソッドの具体的な処理内容を実装する.

id はなに?

Objective-C では, オブジェクト型の変数を宣言する場合, id という共通のデータ型が利用できる. (どんなクラスのオブジェクトでも保存できる便利なデータ型).

もちろん, クラス名を明示して:

クラス名 *変数名

と記述することもできる.

オブジェクトにメッセージを送る

Objective-C ではメッセージ式, [obj method] を利用する, C++ や Java などでは, obj.method() を利用する.

Objective-C とアプリケーション開発

Cocoa は, 実際に複数のフレームワークを含んでいる. その中心となるのは, Objective-C の基本中の基本である Foundation フレームワークと, GUI を表現する Appkit フレームワーク.