[Mac M2 Pro 12CPU, Ventura 13.6, clang 15.0.0]
教本:『詳解 Objective-C 2.0 第3版』(2011年) chap.04-01
動的バインディングとポリモーフィズムについて学びました。
コードの簡素化に寄与する反面、実行速度が遅くなるようです。
プログラミングをミスった場合、静的バインディングであればコンパイルエラーになり、動的バインディングであれば実行時エラーになります。
これは実務レベルで体感してみないとメリット・デメリットを深く理解できないように思いました。
取りあえず先に進みます。
#import <Foundation/NSObject.h>
#import <stdio.h>
@interface A : NSObject
- (void)whoAreYou;
@end
@implementation A
- (void)whoAreYou { printf("I'm A\n"); }
@end
@interface B : NSObject
- (void)whoAreYou;
@end
@implementation B
- (void)whoAreYou { printf("I'm B\n"); }
@end
int main(void)
{
id obj;
int n;
scanf("%d", &n);
switch (n) {
case 0: obj = [[A alloc] init]; break;
case 1: obj = [[B alloc] init]; break;
case 2: obj = [[NSObject alloc] init]; break;
}
[obj whoAreYou];
return 0;
}
1
I'm B
2
2023-10-16 10:28:08.551 dyna[12438:464557] -[NSObject whoAreYou]: unrecognized selector sent to instance 0x600002a70000
2023-10-16 10:28:08.552 dyna[12438:464557] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSObject whoAreYou]: unrecognized selector sent to instance 0x600002a70000'
*** First throw call stack:
(
0 CoreFoundation 0x00000001aac0b104 __exceptionPreprocess + 176
1 libobjc.A.dylib 0x00000001aa729fd0 objc_exception_throw + 60
2 CoreFoundation 0x00000001aacb210c -[NSObject(NSObject) __retain_OA] + 0
3 CoreFoundation 0x00000001aab73030 ___forwarding___ + 1600
4 CoreFoundation 0x00000001aab72930 _CF_forwarding_prep_0 + 96
5 dyna 0x00000001026efefc main + 176
6 dyld 0x00000001aa75bf28 start + 2236
)
libc++abi: terminating due to uncaught exception of type NSException
Abort trap: 6