gpt4 book ai didi

objective-c - 在同一个 'alloc' ed 对象上多次调用初始化程序是否安全?

转载 作者:太空狗 更新时间:2023-10-30 03:50:19 24 4
gpt4 key购买 nike

我可以用 myImageView = [[UIImageView alloc] initWithImage:image];

构造一个 UIImageView 对象

在影响显示的应用程序事件之后,如果我想更改 UIImageView 上的图像。我可以通过使用 myImageView.image = someNewImage 重新分配它来做到这一点。然而,这似乎并没有更新框架尺寸。我可以手动修改它们,但我在实践中观察到调用 [myImageView initWithImage:someNewImage] 对我来说是这样做的,并且具有更简洁的优势。

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

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

这篇文章给出了关于对象的“alloc”和“init”的一般细节

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/

最佳答案

没有。

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

- (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 不同的内容.

关于objective-c - 在同一个 'alloc' ed 对象上多次调用初始化程序是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4153456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com