iphone - 将消息发送到 objectForKey 到 NSMutableArray 实例,并且有效!!奇怪的?

标签 iphone objective-c ios nsmutablearray selector

我在我的程序中编写了一个非常糟糕的代码,在我学习 Objective C 和 iOS 平台时只是在玩弄。我所做的是,

我已经像这样创建了 NSMutableArray

placeInfo = [NSMutableArray array];

后来在我的代码中我正在做这样的事情,基本上我是在操纵 Google places api 响应(JSON)。

NSDictionary *results = [responseString JSONValue];
placeInfo = [results objectForKey:@"result"];
self.phoneNumber = (NSString *)[placeInfo objectForKey:@"formatted_phone_number"]; // In this line compiler warns me that NSMutableArray might not response to this.

我检查了文档,但没有在 NSMutableArray 中找到 objectForKey。

  • 那么可能是什么原因呢?为什么我的代码没有崩溃?为什么它通过“formatted_phone_number”键返回电话号码?

编辑

在第一个答案之后,我编辑了我的代码并添加了这样的类型转换,但它仍然有效。

NSDictionary *results = [responseString JSONValue];
placeInfo = (NSMutableArray *)[results objectForKey:@"result"];
self.phoneNumber = (NSString *)[placeInfo objectForKey:@"formatted_phone_number"];

最佳答案

我从未使用过 Google Places API,但我猜 [results objectForKey:@"result"] 实际上会返回另一个字典,因此 objectForKey:有效。

因为 objective-c 只是使用指针来引用对象,所以它实际上从未被转换为 NSMutableArray。此外,由于 objective-c 的动态特性,它在编译时不知道某个方法是否存在(您实际上可以在运行时添加方法甚至整个类)。

根据编译器设置,它可能只显示一个警告,指出 objectForKey: 可能 在运行时找不到,并让它继续编译。如果你真的给它传递了一个 NSDictionary,它最终会工作得很好。

即使你把 (NSMutableArray *) cast 放在它前面,它也不会改变任何东西。这只是简单地转换指针类型,实际上并没有以任何方式改变对象。

关于iphone - 将消息发送到 objectForKey 到 NSMutableArray 实例,并且有效!!奇怪的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8429614/

相关文章:

ios - 在单个 ViewController 上使用多个 Tableview

ios - 如何解决来自 Firebase 的 Apple Mach-O 链接器错误?

iphone - 如何以编程方式清除 iPhone 上的浏览​​器缓存?

iphone - 如何获取由子 Sprite 组成的CCSprite的高度和宽度(Cocos2D)

iphone - 如何使用 addSkipBackupAttributeToItemAtURL API?

iPhone Store Kit "cannot connect to itunes store"无法连接到 iTunes 商店”

objective-c - 在 View Controller 之间拖放(包含在同一 View Controller 中)

iphone - 如何更改铃声模式(静音或振动)

iphone - 在单个文件中混合使用 Objective C 和 C++ 的问题

ios - 持续后台更新位置