【问题标题】:Conflicting retain types for property in object vs protocol对象与协议中属性的冲突保留类型
【发布时间】:2014-09-13 01:14:09
【问题描述】:

我有一个名为 Folder 的 Core Data NSManagedObject,上面有一个属性“account”。因为这是一个 NSManagedObject,所以属性是 strong

然后我有一个 FolderProtocol 声明属性“account”也很强大。

然后我有另一个对象,称为 FolderCombo,它符合 FolderProtocol。问题是我需要在这个 FolderCombo 上声明属性“accountweak

帐户具有文件夹以及FolderCombosFolders 没有保留周期,因为 CoreData 负责处理(关系使用 ID 而不是实际对象),但是对于 FolderCombos,除非我特别声明“account" 属性weak

所以一切都很好但是我有一个警告我无法摆脱。我可以/我应该取消这个警告吗?有适当的解决方法吗?

Warning: 'retain (or strong)' attribute on property 'account' does not match the property inherited from 'FolderProtocol'

【问题讨论】:

  • 我认为你应该把它从strong改成retain,如果你改变了默认类型,警告应该消失。
  • 我想听听您在采用该协议的类中将其定义为weak 的原因是什么。保持一致 - 例如,将其设为 strong(或等效地,retain无处不在 - 很可能会让您在以后头疼。
  • @NicolasMiari 如果您阅读上面的内容,由于保留周期,我不能让它变得强大。我也将其更改为保留,警告是相同的
  • 糟糕,很抱歉没有通读!是的,retain 和 strong 是等价的。你不能让它到处变弱吗?
  • 避免保留循环的标准方法是在对象图中有一个清晰的层次结构,并让“父对象”持有对“子对象”的强引用(而不是相反)。

标签: ios objective-c core-data memory-management


【解决方案1】:

好吧,我想出了一些技巧来解决这个问题,但它确实有效。

我创建了一个名为weakAccount 的弱私有属性。

 @property (nonatomic, weak) Account *weakAccount;

然后创建帐户@dynamic 并覆盖访问器以返回并设置weakAccount。

 @dynamic account;

- (void)setAccount:(Account *)account
{
   self.weakAccount = account;
}


- (Account *)account
{
    return self.weakAccount;
}

这样头文件看起来符合协议,但内部引用很弱。

【讨论】:

    【解决方案2】:

    从协议中移除属性,取而代之的是,需要两个方法,一个 getter 和一个 setter。请注意,协议方法可以由(任何类型的)属性实现,但 strongweak 将不再有问题。

    【讨论】:

    • 这是一个很好的解决方案。我的类似,但可能更hacky。我会接受你的回答,因为我相信你的解决方案比我的更优雅、更干净。
    猜你喜欢
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 2023-01-18
    相关资源
    最近更新 更多