代码之家  ›  专栏  ›  技术社区  ›  Jim Blackler

在同一个“alloc”对象上多次调用初始化器是否安全?

  •  5
  • Jim Blackler  · 技术社区  · 14 年前

    UIImageView 反对 myImageView = [[UIImageView alloc] initWithImage:image];

    如果要更改UIImageView上的图像,请执行影响显示的应用程序活动。我可以把它重新分配给 myImageView.image = someNewImage . 但是,这似乎不会更新框架尺寸。我可以手动修改,但我在实践中发现 [myImageView initWithImage:someNewImage]

    但是我不确定在目标C中多次调用 由单个对象构造的对象上的方法 分配

    我到目前为止的研究。。。

    http://developer.apple.com/library/mac/documentation/cocoa/Conceptual/ObjectiveC/Articles/ocAllocInit.html

    这是个相关的问题

    Why are alloc and init called separately in Objective-C?

    供应商 作为初始化过程的结果,可以多次调用其init方法的对象。

    http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-much/

    2 回复  |  直到 7 年前
        1
  •  7
  •   Yuji    14 年前

    不。

    -init 假设它只被调用一次。例如, -initWithImage 你引用的苹果文档中引用的是

    - (id)initWithImage:(NSImage *)anImage {
      ...
      if (self) {
          image = [anImage retain];
      }
      return self;
    }
    

    这假设ivar image 不指向保留的对象。如果打两次电话,就会泄露 .

    -init... 每次仅一次 alloc ,并呼叫 -初始化。。。 紧接着 分配

    SomeClass* foo=[[SomeClass alloc] init...: ... ];
    

    你不应该把他们分开,因为 [anAllocedObject init...] 可能会返回不同于 anAllocedObject .

        2
  •  1
  •   BJ Homer    14 年前

    不,init(或者它的一个变体)应该只在任何对象上调用一次,正如Yuji所解释的。就你的 UIImageView 问题是,我相信你可以打电话给我 [imageView sizeToFit] 分配新图像后,它将自动为您调整大小。