[Obj-C] 04 Objective-C 2.0学習 “オブジェクトの型と動的結合” 04-01

[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