Он делает это, потому что [results objectForKey:@"result"]
возвращает вам что-то, что не NSMutableArray
. То, что возвращается, скорее всего, другое NSDictionary
, которое, конечно, отвечает на objectForKey:
Чтобы узнать, что у вас есть, установите точку останова после result = [placeInfo objectForKey:@"result"]
и проверьте result
. Отладчик скажет вам, с каким объектом вы имеете дело. Держу пари, все, что тебе нравится, это NSDictionary
.
Цель C позволяет вам отправлять любое сообщение (называемое селектором) любому объекту в любое время; среда выполнения не заботится о том, реализует ли конкретный объект данный селектор. Если целевой объект не отвечает на данный селектор, он будет игнорировать его. Это не потерпит крах. В этом отношении он совершенно не похож на большинство других языков ООП, включая C ++ и Java, которые не будут компилироваться, если вы попытаетесь вызвать метод, который не реализует определенный класс. Вы можете узнать, реагирует ли объект на данный селектор (что аналогично использованию самоанализа для проверки того, реализует ли данный класс определенный метод), сказав [result respondsToSelector:@selector(objectForKey:)]
. Это различие между методами и сообщениями крайне важно для понимания цели C. Я бы рекомендовал прочитать Язык программирования Objective C , прежде чем делать что-либо еще.
Кроме того, система типов в Objective C применяется менее строго, чем в других языках. Это вполне законно (хотя и очень плохая идея) делать то, что вы сделали здесь, то есть объявить указатель типа NSMutableArray
, а затем присвоить его (я предполагаю) NSDictionary
.