为什么我们需要为可变对象分配init

时间:2015-07-29 07:13:13

标签: ios init alloc

我不知道此问题是否曾经问过,我正在寻找一些好的答案。

问题是:每当有时我不会使用[[... alloc] init]进行一些可变课程时,我会崩溃。

示例:

NSMutableDictionary *myDict = someObject ; //[allocation of some other dictionary object directly without using alloc , init].

对于某些阶段,编译器在运行时警告我,即使它是可变的,您也无法在myDict内更改值。

如果我写代码,那就不是那样了:

NSMutableDictionary *myDict = [[NSMutableDictionary alloc] initWithDictionary:someObject]; 

然后它有效。

为什么allocinit是必要的?或者实际上是什么问题?

感谢。

2 个答案:

答案 0 :(得分:3)

Objective-C基于C 不是强类型语言:您可以将某种类型的对象放入其他类型的变量中(基本上是因为,在Objective-C中,它们都表示为通过他们的指针)。

当你写:

NSDictionary *immutableDict = [[NSDictionary alloc] init...];
NSMutableDictionary *mutableDict = immutableDict;

您只需将指向不可变字典的指针存储到准备存储指向可变字典的指针的变量中。但它并没有在一个可变的字典中神奇地改变你的不可变字典。

但是当你写:

NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc] initWithDictionary:immutableDict];

您创建一个可变字典,使用不可变字典中包含的值初始化(填充)。所以你现在可以修改你新分配的可变字典,因为它是可变的。

答案 1 :(得分:2)

这是一个非常基本的问题,你的问题已经有很多解决方案(了解alloc,init,new refer following)

alloc, init, and new in Objective-C

Use of alloc init instead of new

alloc and init what do they actually do