gpt4 book ai didi

objective-c - 在 initWithCoder 中使用保留?

转载 作者:太空狗 更新时间:2023-10-30 03:25:33 26 4
gpt4 key购买 nike

我正在阅读有关编码和解码的内容,我注意到有时人们会错过最后的保留,我还注意到保留有时用于某些变量而不是其他变量。我可以问...

(1) 这个 retain 的目的是什么,为什么有时不需要?

(2) 使用 retain 是否意味着我需要将它与 release 匹配,如果是,在哪里?

- (id) initWithCoder: (NSCoder *) decoder {
name = [[decoder decodeObjectForKey: @"CardName"] retain];
email = [[decoder decodeObjectForKey: @"CardEmail"] retain];
}

- (id) initWithCoder: (NSCoder *) decoder {
name = [decoder decodeObjectForKey: @"CardName"];
email = [decoder decodeObjectForKey: @"CardEmail"];
}

加里

最佳答案

您的第一个代码片段代表了正确的行为。 -decodeObjectForKey: 方法不包含单词 initcopynew,因此没有 promise 关于返回的对象是否会保留,如果会保留多长时间。如果你的对象需要它的 ivars 保留,它应该 -retain 它从解码器返回的对象。此 -retain 将需要与 -release 保持平衡,后者将在对象的 -dealloc 方法中(因此对象是使用它保留的一些初始ivars,并在它被销毁时释放它的ivars)。像这样:

- (void)dealloc {
[name release];
[email release];
[super dealloc];
}

不需要保留/释放舞蹈:

  • 如果您正在使用垃圾回收

  • 如果您的对象不需要声明其 ivar 的所有权。情况并非如此。委托(delegate)通常不会保留(但通常也不会存档),使用 assign 修饰符声明的属性也不会保留。

关于objective-c - 在 initWithCoder 中使用保留?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1650110/

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