Должно ли назначение типа из несовместимого типа указателя всегда заканчиваться в target-c? - PullRequest
0 голосов
/ 22 декабря 2018

Я установил несовместимый тип указателя, но код работает нормально.Я хочу знать причину.X1 является точной копией кода X2.

@interface ViewController : UIViewController

@property(retain,nonatomic) X1 *testProperty;

@end

// ###############################

@implementation ViewController

@synthesize testProperty;

   - (void)viewDidLoad {
      [super viewDidLoad];

      testProperty = [X2 new];  --> Warning
      [testProperty printLog];
   }
}

Предупреждение: несовместимые типы указателей, назначаемые дляЭто предупреждение очевидно, но моя проблема в том, как этот код работает нормально?это бросает это?

1 Ответ

0 голосов
/ 22 декабря 2018

Это работает из-за динамической природы Objective-C.Компилятор правильно предупреждает вас о несоответствии типов, но во время выполнения, когда он выполняет отправку сообщения printLog своему получателю, он проверяет, действительно ли объект знает, как обрабатывать это сообщение.Поскольку оба класса X1 и X2 реализуют printLog, это работает.Аналогично, любое сообщение, которое реализовано в любом общем суперклассе X1 и X2 (так, по крайней мере, все из NSObject) также будет работать.

Это называется " Duck Typing"и действительно имеет основополагающее значение для среды выполнения ObjC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...