目标C中的私人和公共财产

时间:2012-05-24 22:18:09

标签: iphone objective-c ios ipad

那么这两个版本之间究竟有什么区别:

@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中基本上意味着它是私有的。如果我错了,请纠正我?那么哪个是最好的实现呢?它只是一种编码风格/实践吗?

2 个答案:

答案 0 :(得分:6)

编译器可以向您发出有关它所知道的事情的警告。

当我导入标题时,编译器可以看到Foo有一个名为barsetBar:的方法。这意味着我可以同时使用它们

[instanceOfFoo setBar:@"some string"];

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

因为我只导入了标题 - 编译器只能看到标题,它不知道还有方法bazsetBaz:可用,所以执行以下操作会导致编译器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。