如何使 NSDate 与关联对象一起工作?

Posted

技术标签:

【中文标题】如何使 NSDate 与关联对象一起工作?【英文标题】:How to make NSDate with associative object work? 【发布时间】:2015-05-18 16:10:33 【问题描述】:

我想将关联对象添加到NSDate 对象。为此,我使用了here 描述的方法。

我现在的问题是 ios 不会(不再?)为同一日期创建不同的 NSDate 对象(请参阅here)。因此,如果我有两个具有相同 NSDate 的项目,我无法区分这些对象,并且我为特定项目添加关联对象的方法失败。

我尝试了不同的方法:

使用copy方法NSDate NSDate *deepCopy = [[NSDate alloc] initWithTimeInterval:0 sinceDate:date]; NSDate *deepCopy = [date dateByAddingTimeInterval:0];

但我命名为deepCopy 的变量不是原始date 对象的深层副本。

我能做什么?

【问题讨论】:

通常当 NS 做一些棘手的事情时,你可以获得一个不做那些棘手事情的 CF 纯 C 版本,或者你至少可以关闭...developer.apple.com/library/ios/documentation/CoreFoundation/… 我认为这也是一个解决方案。但是,我仍然希望有人有另一个想法,这意味着我当前项目的更改更少。 :-) 问题是64位运行时在很多情况下使用“标记指针”(其中指针不是指针而是直接包含信息)。不幸的是,关联对象不适用于标记指针,这也在这里观察到:***.com/questions/21561211/…。 @Martin R:谢谢!现在可以确定了:我必须更改我的代码。 即使在最好的情况下,Objective-C“关联对象”机制也是脆弱的。最好避免它。 【参考方案1】:

您是否考虑过创建一个自定义模型对象来表示日期和您想要与之关联的任何其他数据的组合?应尽可能避免关联对象。为什么不继承 NSObject 来创建具有两个属性的模型对象 - 一个 NSDate 属性和一个用于您要与其关联的附加数据的属性。

【讨论】:

谢谢。是的,这将是比使用关联对象更好的方法。如果我不能使我目前的方法奏效,我会使用它。但是,这意味着我必须对当前代码进行许多更改... 不要误会我的意思,但这是依赖无证行为 (-copy) 和边缘案例解决方案(关联对象)的结果。 你是绝对正确的。我非常后悔我决定使用关联对象。 @vomako 我会说这取决于您与日期对象相关联的信息,但可能不是。如果它本身不是与日期相关的信息,那么我建议的方法可能更合适。 NSDate 是一个类集群,因此子类化它会很困难:)

以上是关于如何使 NSDate 与关联对象一起工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何使普通的 ruby​​ 对象可分配为活动记录关联

多态关联如何与 Ecto 一起工作?

如何使用实体框架关联来自多个上下文的对象

AFrame:如何使光线投射器与 object3D 子对象一起工作?

对象不再存在后如何销毁与对象关联的数据?

如何删除与另一个托管对象关联的托管对象