#import <Foundation/Foundation.h> @interface TestA:NSObject { } - (id) methodA; - (id) methodB; - (id) methodC; @end @implementation TestA - (id) methodA { NSLog(@"class A"); } - (id) methodB { [self methodA]; } - (id) methodC { [super methodA]; } @end @interface TestB : TestA { } - (id) methodA; @end @implementation TestB - (id) methodA { NSLog(@"class B"); } @end int main(void){ TestB *objB = [[TestB alloc] init ]; //selfの確認 [objB methodB]; //superの確認 [objB methodC]; return 0; }
このコードをコンパイルすると以下の警告が表示されます.
main.m: In function ‘-[TestA methodC]’:
main.m:24: warning: ‘NSObject’ may not respond to ‘-methodA’
main.m:24: warning: (Messages without a matching method signature
main.m:24: warning: will be assumed to return ‘id’ and accept
main.m:24: warning: ‘...’ as arguments.)
NSObjectにはmethodAを実装されていないため,もしかしたら動作ができないかもしれないと警告が表示されます.
警告を無視して,実行してみます.
2010-07-16 06:30:27.310 a.out[430:903] class B
2010-07-16 06:30:27.313 a.out[430:903] -[TestB methodA]: unrecognized selector sent to instance 0x10010d980
2010-07-16 06:30:27.315 a.out[430:903] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[TestB methodA]: unrecognized selector sent to instance 0x10010d980'
*** Call stack at first throw:
(
0 CoreFoundation 0x00007fff837b6cc4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x00007fff88f6c0f3 objc_exception_throw + 45
2 CoreFoundation 0x00007fff83810140 +[NSObject(NSObject) doesNotRecognizeSelector:] + 0
3 CoreFoundation 0x00007fff83788d4c ___forwarding___ + 860
4 CoreFoundation 0x00007fff83784e28 _CF_forwarding_prep_0 + 232
5 a.out 0x0000000100000d51 -[TestA methodC] + 56
6 a.out 0x0000000100000dfe main + 136
7 a.out 0x0000000100000ccc start + 52
8 ??? 0x0000000000000001 0x0 + 1
)
terminate called after throwing an instance of 'NSException'
Abort trap
[objB methodB]では,TestBのmethodAが実行されます.
[objB methodC]はTestAのスーパークラスであるNSObjectのmethodAを実行しようとしますが,NSObjectにはmethodAがないので,実行することができないので,エラーになります.
他の言語でも,同様なプログラムを書くとself,superの動作を確認することができますので,お試しあれ.
あと,このプログラムから分かるように,Objective-Cは実装されていないメソッドがあっても,コンパイル時に警告はだしますが,実行できるということが重要です.
0 件のコメント:
コメントを投稿