簡體   English   中英

目標C中的私人和公共財產

[英]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有一個名為barsetBar:的方法setBar: 這意味着我可以同時使用它們

[instanceOfFoo setBar:@"some string"];

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

而因為我只導入了標題 - 編譯器只能看到標題,它不知道還有方法bazsetBaz: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM