我正在阅读有关编码和解码的内容,我注意到有时人们会错过最后的保留,我还注意到保留有时用于某些变量而不是其他变量。我可以问...
(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:
方法不包含单词 init
、copy
或 new
,因此没有 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/