这是一个观察和一个问题:
我正在将一些json数据加载到一个类中(json已经转换为NSDictionary)。这些值只能从外部读取:
@interface Checklist
-(id)initWithJSON:(NSDictionary *)json;
-(NSInteger)checklist_id;
-(NSString *)checklist_name;
etc....
@end
使用.m文件中的相应方法体。
作为测试,我为另一个数据元素创建了一个类:
@interface ChecklistItem
-(id)initWithJSON:(NSDictionary *)json;
@property (readonly) NSInteger item_id;
@property (readonly) NSString *item_name;
@end
从功能上讲,这两个类在@implementation中有类似的方法。在这两种情况下,它们基本上从json中提取适当的值并返回结果。就程序的其余部分而言,这两种方法似乎是可以互换的。
所以我的问题是:
哪种方法最适合使用?
我发现两种方式都具有相同的可读性,到目前为止我找不到任何代码 - 理由偏好一种方式而不是另一种方式。我可以看到第二个选项很好,因为它有点文件json。
答案 0 :(得分:3)
-(NSInteger)checklist_id; -(NSString *)checklist_name;
这不是标准的Objective-C命名。如果要正确执行操作,请遵循平台约定。 Apple在其编码指南文档中对此进行了记录。
哪种方法最适合使用?
就Objective-C而言,它们是等价的。属性语法表达您的意图比手动创建方法更高级别,所以我更喜欢这种方法。它的代码也少了。
答案 1 :(得分:3)
您应该使用属性,一旦您使用KVO,它们就会派上用场。
此外,您可以定义公共只读属性,并使用只在同一个类中使用的readwrite属性在类扩展中覆盖它们。如果你试图实现类似的东西,你将不得不处理私人助手方法 - 代码变得丑陋。
答案 2 :(得分:0)
现在ARC将清理本来应该管理的内存,这一点就不那么重要了 在二传手的内部,但这仍然是非常好的做法。性能开销 与始终获得的安全性相比,调用setter方法也可以忽略不计 经过二传手。
答案 3 :(得分:0)
这是一个主观问题,除了意见之外你什么也得不到,但这是我的:
只读属性只会为您编写getter。如果你没有在你的.m文件中或者在任何地方写一个私有读写属性而只是直接设置ivar,你甚至不会获得关键调用的意愿/确实更改值,并且还必须自己调用它们。
@interface ChecklistItem ()
@property (readwrite) NSInteger item_id;
@property (readwrite) NSString *item_name;
@end
要在您必须执行的对象内访问它们KVO complient:
self.item_id = 13;
而不是:
_item_id = 13;
当然你可以使用getter方法:
-(NSInteger)checklist_id;
-(NSString *)checklist_name;
只需将所有更改包装在KVO方法中:
[self willChangeValueForKey:@"checklist_id"];
_item_id = 13;
[self didChangeValueForKey:@"checklist_id"];
它只是一种编码风格选择,有时会利用编译器为您编写的内容。但任何一种选择都是一样的。
答案 4 :(得分:-1)
如果值是只读的,我认为您希望它们作为方法而不是只读属性,以避免可能设置值的任何混淆。除非您希望订阅者能够使用点符号来访问属性,但如果您只是返回NSDictionary中的值,那么方法表单会更好,因为您没有保留另一个副本数据