为什么我们需要为可变对象分配、初始化

Why we need to alloc , init for a mutable object

我不知道之前是否有人问过这个问题,我正在寻找一些好的答案。

问题是:每当 有时 我不使用 [[... alloc] init] 一些可变的 class ,我就会崩溃。

示例:

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

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

如果我写代码而不是那样:

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

然后就可以了。

那么为什么 alloc , init 是必要的?或者实际上是什么问题?

谢谢。

这是一个非常基本的问题,您的问题已经有许多解决方案(要了解 alloc、init、new,请参阅以下内容)

alloc, init, and new in Objective-C

Use of alloc init instead of new

alloc and init what do they actually do

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

当你写:

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

您只需将指向不可变字典的指针存储到准备存储指向可变字典的指针的变量中。但它不会神奇地将不可变字典转换为可变字典。

但是当你写的时候:

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

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