2013-10-02 40 views
0

我想知道里程表變量在下面的例子中的行爲如何。我的意思是說它在擴展中聲明的是私有的?目標-c中擴展的變量

//In Car.m 
#import "Car.h" 
@interface Car() 
@property (readonly) double odometer; 
-(BOOL)engineIsWorking; 
@end 

回答

1

是的。由於您正在聲明擴展名爲.m文件,並且您從未#import這個.m文件在任何地方(您的#import.h),只有.m文件中的代碼才能訪問此擴展。

the docs指出:

類擴展通常用於公共接口與用於類本身的實現中使用附加的私有方法或屬性延伸。

+0

雖然這不是一個類別,擴展是截然不同的。具體來說,一個類別可以有'@實現',不能合成'@ property's。擴展只能擴展'@ implementation'(如果在編譯'@ implementation'之前聲明,並且還可以聲明合成的屬性,包括將readonly屬性提升爲readwrite。 – bbum

+0

是的,我混淆了。 ,我編輯,以防止混淆其他人讀這也:) –

2

在擴展中聲明的變量/方法只有在它們被導入到或在其中聲明的編譯單元中才可見。

例如,你可以把你的擴展在一個名爲Car_Private.h文件,然後#import "Car_Private.h"兩個Car.m(所以@implementation Car自動合成存儲和方法)和Tire.m。通過這樣做,Tire.m將有效訪問engineIsWorkingodometer

也就是說,擴展名只是您想要的「私有」。請注意Objective-C中沒有什麼是真正的私有的;它在編譯時只是私有的。