在同一个'alloc'ed对象上多次调用初始值设定项是否安全?

时间:2010-11-11 10:31:06

标签: objective-c

我可以用UIImageView

构建一个myImageView = [[UIImageView alloc] initWithImage:image];对象

在影响显示的应用程序活动之后,如果我想更改UIImageView上的图像。我可以通过myImageView.image = someNewImage重新分配来实现。但是,这似乎不会更新框架尺寸。我可以手动修改它们,但我在实践中观察到调用[myImageView initWithImage:someNewImage]为我做了这个,并且具有更好的优势。

但是我不确定在Objective C中是否正式违反协议,在由单个 alloc 构造的对象上多次调用 init 方法。我不会使用它,除非它是安全的(保证不会崩溃或导致泄漏)。有证据表明它不安全吗?

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

本文提供了关于对象的“alloc”和“init”的一般细节

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

这与SO问题相关

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 个答案:

答案 0 :(得分:7)

没有

-init的编写假设只调用一次。例如,您引用的Apple文档中引用的-initWithImage实现为

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

这假定ivar image未指向保留的对象。如果调用两次,则会泄漏image

-init...只调用一次alloc,并在-init...之后立即致电alloc,并照常组合:

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

您永远不应将它们分开,因为[anAllocedObject init...]可能会返回与anAllocedObject不同的内容。

答案 1 :(得分:1)

不,正如Yuji解释的那样,init(或其中一个变体)只能在任何对象上调用一次。至于您的UIImageView问题,我相信您可以在分配新图片后致电[imageView sizeToFit],它会自动为您调整大小。