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

标签 objective-c cocoa

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

(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/

相关文章:

objective-c - 如何比较和合并 NSMutableArray

objective-c - "if"条件不起作用

cocoa - 如何在 NSWindow 上动态加载 NSView?

ios - 从另一个 subview 内部和下方添加一个 subview

ios - 在 Xcode 6.1 上添加外部库

objective-c - 将邮件拖放到 OS X 应用程序中

ios - Facebook:从 iOS 应用分享给特定的人或列表

objective-c - 如何在我的应用程序执行操作时放置加载 gif 图像?

iphone - 根据按下的按钮(iOS)检索自定义数据?

cocoa - 如何将 NSMutableData 转换为 View 中的图像?