2013/06/16

[obc]やっぱり名前に縛りはないのか?

いろいろと考えたが、やっぱりObjective-Cの(あるいはFoundationの)命名ルールというものはあったとしても、名前によって動作が変わるような縛りはないんじゃなかろうか、と思った。

だって、やっぱり、予約語のように言語で確保しているわけでもないのに、動作が名前だけで縛られるってのはおかしいと思うからだ。
そういう動きをしたいなら、JavaのAnnotationsみたいにやってしまわないと、わかりづらい。

という推測だけじゃなくて、AppleのCocoa向け コーディングガイドライン[pdf]にも、そういうことが書かれてなかったのだ。
allocも「allocは略語として使ってよいよ(普通は略語は推奨せんのだがね)」みたいに書いてあるだけだ。


あとは気になるのが、「allocは標準なの?」だ。
isa変数を試すためにNSObjectを継承したのだが、そもそもallocは使えるのだろうか?

#import <stdio.h>
@interface Hell
- (void)print;
@end
@implementation Hell
- (void)print
{
	printf("self=%p\n", self);
}
@end
int main(void)
{
	Hell *hell = [Hell alloc];
	return 0;
}

yebisu:objc hirokuma$ gcc -o tst 1.m -lobjc
1.m: In function 'main':
1.m:16: warning: 'Hell' may not respond to '+alloc'
1.m:16: warning: (Messages without a matching method signature
1.m:16: warning: will be assumed to return 'id' and accept
1.m:16: warning: '...' as arguments.)

よし、わかった。

allocとかは、やっぱりNSObjectが実装しているメソッドなんだ(クラスメソッド、だっけ)。
そういうことからすると、Objective-Cにはコンストラクタやデストラクタのしくみはなく、それはFoundationだかCocoaだか知らないが、とにかくそういうフレームワーク上で実現している、ということか。

allocやnewは予約語ではなく、単なるメソッド名にすぎない。
ARC用の参照カウンタや、前回のisa変数なども、NSObjectがうまいこと処理しているだけということだ。

言語仕様に隠されていない分、わかりやすいといえばわかりやすい。。。のか?
C++は言語仕様になっているがために、言語の仕様書が分厚くなった。
Objective-Cはフレームワークと一体化したところがあるため、組込みの人みたいに「言語+それ以外は調べる」という人にとっては、「ARCがなんで言語のバージョンじゃなくてOSのバージョンに依存するんだ?」というところがわかりづらいんじゃなかろうかね。
正確には、OSのバージョンじゃなくて、つかっているフレームワークのバージョン、ということになるのか。

まだまだ把握はできていないが、何がどこまでサポートしているのかを知っておかないといかんだろう。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。