類屬性 (Objective-C Class Properties)
官方解釋
先看下它在Xcode8 release版本中官方給出的解釋:
Objective-C now supports class properties, which interoperate with Swift type properties. They are declared as: @property (class) NSString *someStringProperty;. They are never synthesized. (23891898)簡單來說就是Objective-C現在支持與Swift類型屬性進行交互轉換的類屬性,這些屬性永遠不會synthesized,不會生成set和get方法。
就解釋來看,似乎Objective-C獲得這一功能是提高與Swift的互通性。 向Objective-C添加 class 屬性映射到Swift中使用類變量。不過我們可以在OC中使用這個功能,更方便愉快的coding。
用法
我們新建一個TestCar類,同時有一個屬性 desc
以便於在其他類訪問我們在.h文件里面聲明一個屬性
1 @interface TestCar : NSObject 2 3 @property (nonatomic, copy, class) NSString *desc; 4 5 @end
當我們聲明一個class屬性的時候,編譯器會發出警告!這也就是前面說的They are never synthesized.
這兩個屬性永遠不會synthesized,因此如果我們不顯式的添加setter和getter方法,XCode就會提示警告信息使用@dynamic或者是提供setter和getter方法; 注意在getter方法前面使用 + 讓其成為一個類的方法
10.59.43.png
接下來我們簡單實現一下set 和 get方法,以便在其他地方調用
1 static NSString * _desc = nil; //這里我們可以把它聲明為靜態變量 2 3 @implementation TestCar 4 5 + (NSString *)desc{ 6 if (!_desc) { 7 _desc = [[NSString alloc] init]; 8 } 9 return _desc; 10 } 11 12 + (void)setDesc:(NSString *)desc{ 13 _desc = desc; 14 } 15 @end
接下來就可以調用了,可以使用類名上的普通點語法訪問類屬性
1 TestCar.desc = @"布加迪限量"; 2 NSLog(@"%@", TestCar.desc);
這里就可以正常輸出內容了
同時也需要注意的是,由於這是Xcode 8中的LLVM編譯器的一項功能,因此它可以在低於iOS 10的環境下使用。
總結一下
假如一個類里面都是類方法,或者想在其他地方訪問一個類里面的信息,並且這個類里面還有一些屬性的話,那么可以使用class修飾生成類屬性,這樣調用的時候可以直接使用類名調用,不用再生成一個該類的實例來調用了,使用類屬性會更方便一點。
當然想使用這個功能你要付出的就是自己生成set和get方法。想必這不是什么難題!
屬性用class修飾同時你也可以修飾為readonly只讀,它並不會影響其他功能。
