2010年7月16日金曜日

[Objective-C] Objective-Cのself,superを確認してみる

何をいまさらと言われてしまうが,最近いろいろな言語をやっていたりすると不安になってきたので,一応確認.

#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 件のコメント:

コメントを投稿