Ios 对象与协议中属性的保留类型冲突

Ios 对象与协议中属性的保留类型冲突,ios,objective-c,core-data,memory-management,Ios,Objective C,Core Data,Memory Management,我有一个名为文件夹的核心数据NSManagedObject,上面有一个属性“帐户”。由于这是一个NSManagedObject,因此属性为strong 然后我得到了一个FolderProtocol,它也声明了属性“account”strong 然后我有另一个对象,叫做FolderCombo,它符合FolderProtocol。问题是我需要在此FolderCombo上声明属性“account”weak 帐户具有文件夹以及文件夹组合。文件夹不存在保留周期,因为CoreData负责这一点(关系使用ID

我有一个名为文件夹的核心数据NSManagedObject,上面有一个属性“帐户”。由于这是一个NSManagedObject,因此属性为strong

然后我得到了一个FolderProtocol,它也声明了属性“account”strong

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

帐户具有文件夹以及文件夹组合。文件夹不存在保留周期,因为CoreData负责这一点(关系使用ID而不是实际对象),但是文件夹组合不存在保留周期,除非我特别声明“帐户”属性

所以一切都很好,但是我有一个无法摆脱的警告。我是否可以/应该取消这个警告?有没有合适的解决办法

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

我想出了一个小办法来解决这个问题,但它奏效了

我创造了一个叫做weakAccount的脆弱的私有财产

 @property (nonatomic, weak) Account *weakAccount;
然后只需创建account
@dynamic
,并重写访问器以返回并设置weakAccount

 @dynamic account;

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


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

这样,头文件似乎符合协议,但内部引用很弱

从协议中删除属性,需要两个方法,一个getter和一个setter。请注意,协议方法可以通过属性(任何类型)来实现,但您将不会再遇到
strong
vs
weak
的问题。

我认为您应该将其从
strong
更改为
retain
,警告应该消失,如果您更改了默认类型,我想听听您为什么在采用该协议的类中将其定义为
weak
。保持一致性-例如,使其在任何地方都
强大
(或等效地,
保留
)-很可能会让你在未来的道路上省去一个头疼的问题。@NicolasMiari如果你读了上面的内容,我不能让它强大,因为保留周期。我还将其更改为保留,警告为identicalOops,很抱歉没有通读!是的,retain和strong是等效的。你不能让它处处都变弱吗?避免保留循环的标准方法是在对象图中有一个清晰的层次结构,让“父对象”包含对“子对象”的强引用(而不是相反)。这是一个很好的解决方案。我的类似,但可能更粗糙。我会接受你的回答,因为我相信你的解决方案比我的更优雅、更干净。