Нужно спросить точно, почему вы хотите сделать это в первую очередь.Вы сказали:
Учитывая толерантность и динамичность цели c, мне нравится делать код «доказательством злоупотребления».Вместо того, чтобы иметь нераспознанное селекторное сообщение, у меня есть сообщение, сообщающее, к какому классу должен относиться объект.
Если вы передаете объект методу, который не соответствует типу, объявленному в подписито есть вы делаете что-то вроде этого:
- (void)doSomething:(NSArray *)array { /* Do something * }
- (void)doSomethingElse
{
NSString *string = @"my string";
[self doSomething:string];
}
вы получите предупреждение, поэтому вы должны знать в время компиляции , что типы объектов не совпадают.
Конечно, это не защитит вас при использовании более общего типа, такого как id
, но если вы беспокоитесь о нераспознанных селекторах, вам действительно следует проверить, реагирует ли объект на этот селектор, вместо этогоиспользования assert:
- (id)doSomething:(id)obj
{
if ([obj respondsToSelector:@selector(calculateSomething)]) {
return [obj calculateSomething];
} else {
NSLog(@"%@ does not respond to calculateSomething", obj);
}
}
Или используйте протоколы для проверки доступности методов.
Тем не менее, да, ваш макрос будет работать для вашей намеченной цели.