我可以用UIImageView
myImageView = [[UIImageView alloc] initWithImage:image];
对象
在影响显示的应用程序活动之后,如果我想更改UIImageView上的图像。我可以通过myImageView.image = someNewImage
重新分配来实现。但是,这似乎不会更新框架尺寸。我可以手动修改它们,但我在实践中观察到调用[myImageView initWithImage:someNewImage]
为我做了这个,并且具有更好的优势。
但是我不确定在Objective C中是否正式违反协议,在由单个 alloc 构造的对象上多次调用 init 方法。我不会使用它,除非它是安全的(保证不会崩溃或导致泄漏)。有证据表明它不安全吗?
到目前为止我的研究......
本文提供了关于对象的“alloc”和“init”的一般细节
这与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/
答案 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]
,它会自动为您调整大小。