前回の記事が評判良かったので、続編。
そのとき提示したサンプルコードは、実は、もうちょっと obj-c っぽく書ける。
以下のようになる。
#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>
#import <stdio.h>
// Person クラスの宣言
@interface Person : NSObject
@property(nonatomic)NSString *name;//ここが変わった!
- (void)printName;
@end
// Person クラスの実装
@implementation Person : NSObject
- (void)printName {
printf("My name is %s \n", [_name UTF8String]);//_ がついていることに注意
}
@end
// 実行プログラム
int main(void) {
id person;
person = [[Person alloc] init];
[person setName:@"akiba"];
[person printName];
return 0;
}
一見して気がつくのは、@property なるディレクティブが出現していることだろう。
そのかわり setName というメソッドが消えた。
想像つくかと思うが、フィールド変数のセッター&ゲッター定義は @property で代用がきく。
なお、nonatomic はスレッドセーフでは「ない」ことを明示するオプション。こんなところでスレッドセーフにしても意味がないので、明示した。(指定しないと atomic になる)
また、@property で生成されるフィールド変数 は先頭に _ がつく。
ここまでくると、何とも obj-c っぽい。
逆に、ここら辺を理解せずに obj-c のコードを読むと、「なんだ、これ?」になると思う。
ところで、アクセサ(セッター・ゲッター)によるカプセル化はオブジェクト指向言語の特徴の一つだろうが、obj-c ではここでもまたディレクティブで対応する方法をとっている。
ここまで徹底しているとなんか清々しいですね(笑)。


“Objective-C 再入門 -1.0.1-” への1件の返信