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只读,它并不会影响其他功能。