[英]private and public property in objective-C
那么這兩個版本之間究竟有什么區別:
@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中基本上意味着它是私有的。 如果我錯了,請糾正我? 那么哪個是最好的實現呢? 它只是一種編碼風格/實踐嗎?
編譯器可以警告您了解它所知道的事情。
當我導入頭時,編譯器可以看到Foo
有一個名為bar
和setBar:
的方法setBar:
。 這意味着我可以同時使用它們
[instanceOfFoo setBar:@"some string"];
NSLog(@"%@", [instanceOfFoo bar]);
而因為我只導入了標題 - 編譯器只能看到標題,它不知道還有方法baz
和setBaz:
available,所以這樣做會導致編譯器barf
[instanceOfFoo setBaz:@"some string"];
NSLog(@"%@", [instanceOfFoo baz]);
但是,如果我知道它們存在,那么我仍然可以訪問這些屬性,而不使用編譯器barfing這樣使用KVC
[instanceOfFoo setValue:@"some string" forKey:@"baz"];
NSLog(@"%@", [instanceOfFoo valueForKey:@"baz"]);
你的理解是正確的。 將@property放在.m中的@interface使其“私有”。 這意味着如果您嘗試從包含不包含@property聲明的.h的其他類訪問該屬性,您將收到編譯器警告。 這並不意味着您無法訪問該屬性,只是編譯器會對您大喊大叫。
至於最好,沒有一個是最好的。 你應該實現一個對你有意義的對象,它可以包括.h和.m中的項目(只讀.h中的完整屬性.h)。 基本上如果@property不應該在你的課外訪問,請將它放在.m中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.