我想知道里程表變量在下面的例子中的行爲如何。我的意思是說它在擴展中聲明的是私有的?目標-c中擴展的變量
//In Car.m
#import "Car.h"
@interface Car()
@property (readonly) double odometer;
-(BOOL)engineIsWorking;
@end
我想知道里程表變量在下面的例子中的行爲如何。我的意思是說它在擴展中聲明的是私有的?目標-c中擴展的變量
//In Car.m
#import "Car.h"
@interface Car()
@property (readonly) double odometer;
-(BOOL)engineIsWorking;
@end
是的。由於您正在聲明擴展名爲.m
文件,並且您從未#import
這個.m
文件在任何地方(您的#import
的.h
),只有.m
文件中的代碼才能訪問此擴展。
如the docs指出:
類擴展通常用於公共接口與用於類本身的實現中使用附加的私有方法或屬性延伸。
在擴展中聲明的變量/方法只有在它們被導入到或在其中聲明的編譯單元中才可見。
例如,你可以把你的擴展在一個名爲Car_Private.h
文件,然後#import "Car_Private.h"
兩個Car.m
(所以@implementation Car
自動合成存儲和方法)和Tire.m
。通過這樣做,Tire.m
將有效訪問engineIsWorking
和odometer
。
也就是說,擴展名只是您想要的「私有」。請注意Objective-C中沒有什麼是真正的私有的;它在編譯時只是私有的。
雖然這不是一個類別,擴展是截然不同的。具體來說,一個類別可以有'@實現',不能合成'@ property's。擴展只能擴展'@ implementation'(如果在編譯'@ implementation'之前聲明,並且還可以聲明合成的屬性,包括將readonly屬性提升爲readwrite。 – bbum
是的,我混淆了。 ,我編輯,以防止混淆其他人讀這也:) –