那么这两个版本之间究竟有什么区别:
@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中基本上意味着它是私有的。如果我错了,请纠正我?那么哪个是最好的实现呢?它只是一种编码风格/实践吗?
答案 0 :(得分:6)
编译器可以向您发出有关它所知道的事情的警告。
当我导入标题时,编译器可以看到Foo
有一个名为bar
和setBar:
的方法。这意味着我可以同时使用它们
[instanceOfFoo setBar:@"some string"];
NSLog(@"%@", [instanceOfFoo bar]);
因为我只导入了标题 - 编译器只能看到标题,它不知道还有方法baz
和setBaz:
可用,所以执行以下操作会导致编译器barf
[instanceOfFoo setBaz:@"some string"];
NSLog(@"%@", [instanceOfFoo baz]);
但是如果我知道它们存在,那么我仍然可以访问这些属性,而不使用编译器barfing这样使用KVC
[instanceOfFoo setValue:@"some string" forKey:@"baz"];
NSLog(@"%@", [instanceOfFoo valueForKey:@"baz"]);
答案 1 :(得分:1)
你的理解是正确的。将@property放在.m中的@interface使其“私有”。这意味着如果您尝试从包含不包含@property声明的.h的其他类访问该属性,您将收到编译器警告。这并不意味着您无法访问该属性,只是编译器会对您大喊大叫。
至于最好,没有一个是最好的。你应该实现一个对你有意义的对象,它可以包括.h和.m中的项目(只读.h中的完整属性.h)。基本上,如果不能在类之外访问@property,请将其放在.m。
中