我正在Objective-C中设计一个使用核心数据结构的应用程序。
我有以下结构:
@interface classA : NSManagedObject
@property(nonatomic, strong) someType1 * property1;
..
@property(nonatomic, strong) someTypeN * propertyN;
@property(nonatomic, strong) NSSet * children;
@end
和
@interface classB : classA
@property (nonatomic, strong) classA * parent;
@end
我有以下功能:
1)classA的每个对象在classB中都有很多子对象。 (classB中的对象本身没有子级)。
2)此外,classB的大多数对象将与它们的父级共享许多共同的属性(例如,您可以认为在大多数情况下,classB的对象和classA的父级中的属性相同,属性1不同,所以对于classB中的x x.property2 = x.parent.property2等等。
3)我只会通过对classA类型的对象的请求来查询数据库。
我正在寻找一种通过仅存储classB类型的对象的必要属性来减少应用程序的磁盘内存使用量的方法。例如,我可以将classB对象的属性设置为nil,除非它与其父对象的属性不同,将classB的getter定义为:
- (sometypeX*) getPropertyX {
if (propertyX) return propertyX;
return parent.propertyX;
}
我的问题是: 1)我真的要通过用nil值而不是实际值填充我的数据库来获得磁盘内存 2)这种结构是否有缺点 3)是否有更好的方法/设计模式来处理这个问题?
提前感谢您的帮助。
答案 0 :(得分:0)
核心数据经过高度优化。它已经使用错误实现了您尝试实现的功能。来自文档中的Faulting and Uniquing:
由于未实现故障,托管对象故障消耗的内存较少,并且根本不需要在内存中表示与故障相关的托管对象。
回答你的问题......
1)我真的会通过用nil值而不是实际值填充我的数据库来获得记忆
如果你通过这种方法获得任何记忆,那可能是微不足道的。
2)这种结构是否存在缺陷
它为您的代码库增加了很多复杂性而没有太多理由。它使您的代码更难以阅读,理解和维护。
3)是否有更好的方法/设计模式来处理这个问题
只需以易于理解的方式使用Core Data,并让它处理优化,除非您有明确的,可衡量的进一步优化需求。
答案 1 :(得分:0)
我在问过问题之后做了一些测试。
我测试了以下设置:我有一个带有11个NSString属性的classA和classB中的子类。 classB是classA的子类,具有相同的属性和父属性。
我在100到1000个classA实例之间随机创建,每个实例在classB中有10到1000个子节点。对于classA的对象,我将每个字符串属性设置为随机的10个字符的字符串。
我测试了两个程序: - objectA的子项的字段设置为nil - 或者将其设置为其父属性。
我监控了数据库文件的大小。
不幸的是,我无法从文件的增长率中提取线性规律(虽然这只适用于一个类,但我无法用这个更复杂的父/子结构来解决它)。此外,我无法理解以.sqlite结尾的文件和以.sqlite-wal结尾的文件之间的大小重新分区。
然而,在所有测试的制度中(总db大小介于1 Mb和100 Mb之间),我发现当使用第一种方法时,与第二种方法相比,我获得了大约3倍。
因此,对于这种使用方式而言,不设置某些属性似乎会导致db大小的增益微不足道。
如果您希望我详细说明这个答案,请告诉我。