定义类的“正确”方法 - 属性与方法

时间:2013-03-14 20:10:12

标签: ios objective-c

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

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

5 个答案:

答案 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中的值,那么方法表单会更好,因为您没有保留另一个副本数据