【问题标题】:Why we need to alloc , init for a mutable object为什么我们需要为可变对象分配、初始化
【发布时间】:2015-07-29 07:13:13
【问题描述】:

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

问题是:每当有时我不将[[... alloc] init] 用于某些可变类时,我就会崩溃。

例子:

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

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

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

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

然后就可以了。

那么为什么需要allocinit?或者实际上是什么问题?

谢谢。

【问题讨论】:

  • 您确定没有将普通的NSDictionary 分配给NSMutableDictionary 变量然后尝试对其进行变异吗?
  • 我将普通字典分配给 mutable object 。那有什么问题? @Fonix
  • 好好想想,你不能改变一个不可变的NSDictionary,即使它被分配给一个NSMutableDictionary变量类型,这并不意味着NSDictionary已经变成了一个NSMutableDictionary。你必须使用 alloc init 来完成它,以便它创建一个 NSMutableDictionary 与之前的 NSDictionary 具有相同的键/值
  • @RSD 你不能那样做。将对象分配给另一种类型不会更改对象的原始类型。如果要将NSDictionary 分配给NSMutableDictionary 引用,则必须使用NSDictionarymutableCopy 方法。
  • 不,没有可变对象,只是一个您误认为可变的指针。如果您需要一个可变副本,请创建一个可变副本:NSMutableDictionary *myDict = [someObject mutableCopy]

标签: ios init alloc


【解决方案1】:

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

当你写作时:

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

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

但是当你写的时候:

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

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

【讨论】:

    【解决方案2】:

    这是一个非常基本的问题,您的问题已经有很多解决方案(要了解 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 2019-04-18
      • 2014-06-30
      相关资源
      最近更新 更多