我正在读一本关于 Cocoa 的书,我已经到了作者声明一个属性的部分,@property (strong) NSMutableDictionary *characters;
然后像这样初始化它:self.characters = [NSMutableArray array];
如果有人能解释初始化过程中发生的事情,我将非常感激。我知道[NSMutableArray array]
返回一个空数组,但这与 NSMutableDictionary 有什么关系?
提前致谢。
我正在读一本关于 Cocoa 的书,我已经到了作者声明一个属性的部分,@property (strong) NSMutableDictionary *characters;
然后像这样初始化它:self.characters = [NSMutableArray array];
如果有人能解释初始化过程中发生的事情,我将非常感激。我知道[NSMutableArray array]
返回一个空数组,但这与 NSMutableDictionary 有什么关系?
提前致谢。
它是一个错字,它甚至会在没有警告的情况下编译,因为[NSMutableArray array]
返回id
。一旦执行了调用NSMutableDictionary
方法的代码,它就会崩溃unrecognized selector sent to instance NSMutableArray
。但是,如果您调用count
它,它不会崩溃,因为两种类型都有该方法,因此,编译器会很乐意编译它,因为您已经告诉它它是 anNSMutableDictionary
并且运行时会找到该方法并调用它,因为实际上这是一个NSMutableArray
. 这绝对是一个错字,我想不出你想要“利用”这种可能性的充分理由。
这只是一个错字。无法使用alloc/init 调用来初始化NSMutableDictionary
对象。NSMutableArray
该课程可能会向您展示如何声明属性只是您在编写代码时使用的指南。在运行时,您实际分配的任何类(在本例中为 NSMutableArray)都是实际分配并存储到内存中的对象类型。如果您尝试在对象上使用无法识别的选择器(如 setObject:forKey:),稍后将引发异常。
您的特定实现可能不会导致异常,因为这两个类都响应某些相同的选择器,例如 count,并且它们都适用于快速枚举。
但是,以这种方式做事通常没有任何好处。事情应该是他们所说的那样。
旁注:一旦你对这些东西更熟悉了,请研究一个名为 Forward Invocation 的 Objective C 特性,它允许类通过将请求转发到另一个类来响应它们尚未实现的选择器。
NSMutableDictionary *dict = [NSMutableArray array];
这将创建NSMutableArray
对象。
Xcode Product menu-> generate output ->Assembly file
L_OBJC_CLASSLIST_REFERENCES_$_:
.quad _OBJC_CLASS_$_NSMutableArray
NSArray
管理有序的对象集合。NSDictionary
管理键和值的关联。NSMutableDictionary
你不应该用初始化NSMutableArray
。
NSMutableDictionary *dict = [[NSMutableArray alloc] init]; // return type is NSMutableArray
Warning :Incompatible pointer types initializing 'NSMutableDictionary *' with an expression of type 'NSMutableArray *'
NSMutableDictionary *dict = [NSMutableArray array]; // return type is id + (id)array
NO Warnings