我经常想要保留列表,或者传递基本上只是值集的状态块.值往往是原始类型:浮点数,NSTimeIntervals,CGPoints等.
我的第一个倾向通常是为这些属性集创建C结构,例如
typedef struct _STATE { float foo; NSTimeInterval elapsed; CGPoint point;} STATE;
等等
但是C结构与本机Cocoa集合类(NSArray,NSSet,NSDictionary)不能很好地结合使用,并且使用它们来跟踪很多状态,感觉就像它运行在我的Cocoa友好代码的其余部分 – 我最终拥有并直接管理结构数组,并在消息中传递struct指针等.
另一方面,由于原始性能不一定是关键,我可以将这些值编码为NSDictionary,将它们全部包装在NSValue或NSNumber中,但结果语法几乎不简洁,有点脆弱,需要类型和名称正确性插入和查找的运行时:
[stateDict setobject:[NSNumber numberWithfloat:foo] forKey:@"bar"];... float something = [[stateDict objectForKey:@"bar"] floatValue];
某些类型,如NSTimeInterval,只能与一些(可论证的)Hackery一起使用(在这种情况下,类型转换为double).
最后,我可以创建仅限数据的容器对象,包含私有成员数据,只有getter / setter. (这些在Java中被称为“bean”.)这些比字典更容易访问,更多Cocoa而不是结构,但对我来说感觉有些过分,特别是如果我只需要它们作为用于状态管理的“内部类”单个对象类型的内部.
你是如何,伟大的Cocoa编程公众,这样做?
解决方法 根据具体情况,我使用NSDictionary类运行任意数据,或者我创建容器类(Objective C中的@ property / synthesize标签使这非常简单).通过使用ObjC作为头文件:@interface StateObject : NSObject { NSNumber *foo; NSTimeInterval *elapsed; CGPoint point;}@property (retain) NSNumber *foo;@property (retain) NSTimeInterval *elapsed;@property (copy) CGPoint point;@end
然后可以使用@synthesize< variable>在.m文件中自动创建setter / getters.然后,虽然匿名NSNumbers仍然是ornery,你可以这样做:
myStateObject.foo = [NSNumber numberWithfloat:7.0];
这应该可以消除大部分的痛苦,让你使用Cocoa集合类来更好地改变数据.
总结以上是内存溢出为你收集整理的“仅数据”Objective-C对象的更好替代方案?全部内容,希望文章能够帮你解决“仅数据”Objective-C对象的更好替代方案?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)