3

那么这两个版本之间实际上有什么区别:

@interface Foo : NSObject
// A guy walks into a bar.
@property(nonatomic, copy) NSString *bar;
@end

// Implementation file
@interface Foo ()
@property(nonatomic, retain) NSArray *baz;
@end

@interface Foo : NSObject
// A guy walks into a bar.
@public
@property(nonatomic, copy) NSString *bar;

@private
@property(nonatomic, retain) NSArray *baz;
@end

据我了解,将@property 放在 .m 中基本上意味着它是私有的。如果我错了,请纠正我?那么哪个是最好的实现呢?它只是一种编码风格/实践吗?

4

2 回答 2

6

编译器可以警告你它知道的事情。

当我导入你的头文件时,编译器可以看到它Foo有一个名为barand的方法setBar:。这意味着我可以同时使用它们

[instanceOfFoo setBar:@"some string"];

NSLog(@"%@", [instanceOfFoo bar]);

而因为我只导入了标头 - 编译器只能看到标头它不知道还有方法bazsetBaz:可用,所以执行以下操作将导致编译器出错

[instanceOfFoo setBaz:@"some string"];

NSLog(@"%@", [instanceOfFoo baz]);

但是,如果我知道这些属性存在,我仍然可以通过像这样使用 KVC 来访问这些属性,而无需编译器

[instanceOfFoo setValue:@"some string" forKey:@"baz"];

NSLog(@"%@", [instanceOfFoo valueForKey:@"baz"]);
于 2012-05-24T22:52:27.990 回答
1

你的理解是正确的。将@property 放在.m 中的@interface 中使其“私有”。这意味着如果您尝试从另一个包含不包含 @property 声明的 .h 的类访问该属性,您将收到编译器警告。这并不意味着您不能访问该属性,只是编译器会对您大喊大叫。

至于最好的,没有一个是最好的。您应该实现对您的对象有意义的那个,它可以包括 .h 和 .m 中的项目(在 .h 中只读,在 .m 中具有完整属性)。基本上,如果不应在您的班级之外访问@property,请将其放在.m 中。

于 2012-05-24T22:25:30.620 回答