11.9 Тип id

Вверх  Предыдущий  Следующий

Тип id обособлен в Objective-C/Pascal. Он напоминает, тип pointer в Object Pascal, за исключением того, что это настоящий класс. Его присвоения совместимы с экземплярами каждого из типов objcclass и objcprotocol, в обоих направлениях:

1.Переменные любого типа (objcclass/objcprotocol) могут быть присвоены переменной типа id.

2.Переменные типа id могут быть присвоены переменным любого определенного типа (objcclass/objcprotocol).

Явного приведения типов не требуется для любого из этих присвоений.

Кроме того, любой метод Objective-C , объявленный в objcclass или objccategory, который находится в области видимости можно вызвать используя идентификатор переменной типа id.

Если во время выполнения экземпляр objcclass, хранящийся в переменной id типа, не отвечает на отправленное сообщение, программа будет завершена с ошибкой времени выполнения: так же, как механизм вызова variants под MS-Windows.

При наличии нескольких методов с тем же Pascal именем, компилятор будет использовать стандартную логику разрешения перегрузки, чтобы выбрать наиболее подходящий метод. Он будет вести себя так, как будто все методы objcclass/objccategory в области видимости были объявлены как глобальные overload процедуры (функции). Кроме того, компилятор выведет сообщение об ошибке, если не сможет определить какой перегруженный метод необходим для вызова.

В таких случаях список всех методов, которые могут быть использованы для реализации вызова будет печататься в качестве подсказки.

Чтобы устранить эту ошибку вы должны использовать явное приведение типа, чтобы сообщить компилятору, какой метод objcclass необходимо вызвать.