Я предполагаю, что вы объявили loadedVC
как это:
UIViewController *loadedVC;
Компилятор только позволит вам послать ему сообщения, что это знает, часть UIViewController
@interface
. Это - хорошая вещь. Это предотвращает много ошибок периода выполнения. Но иногда вы знаете лучше, чем компилятор, и вы хотите выключить @interface
проверка.
Когда вы пытаетесь послать сообщение в ценность типа id
, компилятор не проверяет сообщение, потому что , id
является универсальным типом, у которого нет никакого @interface
. Так бросок loadedVC
, чтобы id
:
[(id)loadedVC setDelegate:self];
Обратите внимание что, если loadedVC
не имеет (или наследует), setDelegate:
метод, вы получите ошибку периода выполнения. Если вы хотите проверить на метод сначала, попробуйте это:
if ([loadedVC respondsToSelector:@selector(setDelegate:)]) {
[(id)loadedVC setDelegate:self];
}
Иначе можно сделать это, создавая протокол, содержащий setDelegate:
метод:
@protocol HasDelegate
- (void)setDelegate:(id)delegate;
@end
Тогда можно объявить loadedVC
как это, чтобы сказать компилятору, что это соответствует протоколу:
UIViewController *loadedVC;
Теперь компилятор не будет жаловаться, когда вы попытаетесь послать setDelegate:
, чтобы loadedVC
(даже без броска). Но вы все еще получите ошибку периода выполнения, если loadedVC
не будет на самом деле иметь setDelegate:
метод.