2012-05-24 61 views
1

那么什么是真正的这两个版本之间的区别:私人和公共财产

@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

我实际上有点惊讶,编译器没有将@ public/@ private直接放入@interface直接像这样...... – bbum

+1

@bbum编译器**确实**呛在那个代码上 –

+0

我发现[本文](http://swish-movement.blogspot.com/2009/05/private-properties-for-iphone-objective.html)有用。 – DanSkeel

回答

3

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

当我导入您的头文件时,编译器可以看到Foo有一个方法barsetBar:。这意味着我可以使用这两个

[instanceOfFoo setBar:@"some string"]; 

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

,而因为我只进口了头 - 编译器只能看到标题是不知道,也有方法bazsetBaz:可用,这样做下面将导致编译器BARF

[instanceOfFoo setBaz:@"some string"]; 

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

我可以然而仍然使用KVC这样没有编译器barfing访问这些属性,如果我知道它们的存在

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

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

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

至于最好,没有一个是最好的。你应该实现一个对你有意义的对象,它可能包含.h和.m中的项目(只能在.h中使用.m中的完整属性才能正确读取)。基本上,如果@property不应该在您的课程之外访问,请将其放在.m中。

+0

有点和这个语句混淆了:“这并不意味着你不能访问属性”。我的理解是,将其私人化意味着其他班级无法访问它?好像你在说其他类仍然可以访问私有变量,尽管编译器会警告你..对我来说没有意义 – xonegirlz

+0

当你在实现文件中声明它时,它不完全是私有的,它只是隐藏在其他类中。就像你可以使用私有API即使编译器警告你。 –