0

这是一个观察和一个问题:

我正在将一些 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。

4

5 回答 5

3
-(NSInteger)checklist_id;
-(NSString *)checklist_name;

这不是标准的 Objective-C 命名。如果您想正确地做事,请遵循平台约定。Apple 在其编码指南文档中记录了这一点。

哪种方法最好使用?

就 Objective-C 而言,它们是等价的。与手动创建方法相比,属性语法在更高级别上表达了您的意图,因此我更喜欢这种方法。它的代码也更少。

于 2013-03-14T20:24:41.817 回答
3

您应该使用属性,一旦您使用KVO,它们就会派上用场。

您还可以定义公共只读属性并在类扩展中使用仅在同一类中可用的读写属性覆盖它们。如果你试图实现类似的东西,你将不得不处理私有的辅助方法——代码变得丑陋。

于 2013-03-14T20:34:12.777 回答
0

现在这不那么重要了,因为 ARC 将清理在 setter 内部管理的内存,但这仍然是非常好的实践。与始终通过 setter 获得的安全性相比,调用 setter 方法的性能开销也可以忽略不计。

于 2013-03-14T21:36:55.740 回答
0

这是一个主观问题,你只会得到意见,但这是我的:

只读属性只会为您编写吸气剂。如果您没有在 .m 文件或任何地方正确地编写私有读写,而只是直接设置 ivar,您甚至不会获得键调用的意志/确实更改值,并且还必须自己调用这些值。

@interface ChecklistItem ()
    @property (readwrite) NSInteger item_id;
    @property (readwrite) NSString *item_name;
@end

要在对象内访问它们符合 KVO,您必须执行以下操作:

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"];

这只是一种编码风格选择,有时会利用编译器为您编写的内容。但任何一个选项都一样。

于 2013-03-15T01:00:32.390 回答
-1

如果这些值是只读的,我认为您希望它们作为方法而不是作为只读属性,以避免可能会设置这些值的任何混淆。当然,除非您希望订阅者能够使用点符号来访问属性,但如果您只是返回 NSDictionary 中的值,则方法形式会更好,因为您不必保留另一个副本数据。

于 2013-03-14T20:27:43.063 回答