iOS-class修飾符的解釋及用法


 

類屬性 (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只讀,它並不會影響其他功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM