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

xon*_*rlz 3 iphone objective-c ipad ios

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

@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
Run Code Online (Sandbox Code Playgroud)

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

@private
@property(nonatomic, retain) NSArray *baz;
@end
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*l.s 6

编译器可以警告您了解它所知道的事情.

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

[instanceOfFoo setBar:@"some string"];

NSLog(@"%@", [instanceOfFoo bar]);
Run Code Online (Sandbox Code Playgroud)

而因为我只导入了标题 - 编译器只能看到标题,它不知道还有方法bazsetBaz:可用,所以这样做会导致编译器barf

[instanceOfFoo setBaz:@"some string"];

NSLog(@"%@", [instanceOfFoo baz]);
Run Code Online (Sandbox Code Playgroud)

但是,如果我知道它们存在,那么我仍然可以访问这些属性,而不使用编译器barfing就可以使用这样的KVC

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

NSLog(@"%@", [instanceOfFoo valueForKey:@"baz"]);
Run Code Online (Sandbox Code Playgroud)