いろいろと考えたが、やっぱり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);
}@endint 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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。