Я отвечу на дополнительный вопрос, заданный asker в комментарии.Цитата:
Что если я захочу использовать смешанные типы в этом массиве?т.е. пара UILabel и пара UIImageView.Есть ли способ сравнить типы или использовать дженерики?Это плохое предположение / пример для (NSObject * obj в объектах) {if (label.type == UILabel) [self relocateLabel: obj];иначе if (label.type == UIImageView) [self relocateImage: obj];}
Как ответил Георг Фрицше, обмен сообщениями в Objective-C является динамическим.Объект будет «запрошен», если он поддерживает это сообщение во время выполнения, и если это так, он выполнит метод, связанный с сообщением.Имя метода / сообщения называется «селектором».
Если вы явно хотите выяснить класс объекта, вы также можете сделать это.
if([view isKindOfClass:[UILabel class]])
{
// your code here
}
Если вы просто хотите выяснитьесли целевой объект отвечает на селектор (то есть реализует метод):
if([view respondsToSelector:@selector(relocateView:)])
{
// your code here
}
Селекторы получают из имен методов, пропуская сами аргументы, оставляя двоеточия нетронутыми и добавляя все близко.Например, если у вас есть отправленное сообщение (то есть вызов метода): [thing moveTowardsObject:door movementType:XYZ_CRAWL]
, его селектор будет: moveTowardsObject:movementType:
, и вы получите его, используя @selector(moveTowardsObject:movementType:)
.
В цикле, такомкак и то, что написал Георг, вы обычно хотите просто проверить, реагирует ли целевой объект на селектор, так как в противном случае было бы выброшено исключение, и код Objective C редко перехватывает исключения как часть нормального потока кода (в отличие от того, что разработчики Python).делает).