Emmmmm... Objective-C Class Properties 早在 WWDC 2016 中就已经公示,给 Objective-C 加入这个特性主要是为了与 Swift 类型属性相互操做。html
官方是这么说明的:编程
Interoperate with Swift type properties.微信
嘛~ 虽然是为了配合 Swift 加入的新特性,不过聊胜于无哈!架构
Note: 值得一提的是 Objective-C Class Properties 语法特性虽然是 WWDC 2016 加入的,不过因为是 Xcode 8 中 LLVM Compiler 的特性,所以也适用于 iOS 10 以前的部署版本哟~app
LLVM 官网 对于 LLVM 的定义:编程语言
Note: The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.ide
Emmmmm... 有趣的是,有的文章把 LLVM 强行展开为 "low level virtual machine" 译为 “低级别虚拟机”,不过在 LLVM 官网 能够看到官方明示 LLVM 与传统的虚拟机没有一毛钱关系,名称 "LLVM" 自己不是缩写,它仅仅是项目的名称而已~模块化
嘛~ 可能有的同窗不能理解为什么 LLVM 是一个编译器工具链集合?这就要从 Apple 的编译器历史讲起咯~工具
好久好久之前... 算了,我感受要跑题了(囧),这里简单列一下 Apple 采用过的编译方案吧:学习
GCC, the GNU Compiler Collection 是一套由 GNU 开发的编程语言编译器,最初做为 GNU 操做系统 的编译器使用,后面发展成为类 Unix 操做系统以及 Apple Mac OS X 操做系统的标准编译器。
本来 GCC 仅能处理 C 语言的编译,不过 GCC 很快扩展以支持 C++,以后的 GCC 愈加全面,支持 Objective-C,Fortran,Ada,以及 Go 语言。
值得一提的是 GCC 是一套以 GPL 以及 LGPL 许可证锁发行的 100% 自由软件,这意味着用户能够自由地运行,拷贝,分发,学习,修改并改进该软件。
LLVM 咱们前面介绍过了,是模块化 & 可重用性编译器以及工具链技术集合。
LLVM 可以进行程序语言的 编译期优化、连接优化、在线编译优化、代码生成。
前面介绍过 GCC 支持不少语言,系统架构庞大而笨重,而 Apple 大量使用的 Objective-C 在 GCC 中顺位(优先级)较低。此外,GCC 做为一个纯粹的编译系统,在与 IDE 配合方面的表现也不好。
So,Apple 决定从零开始写 C,C++,Objective-C 的编译器 Clang。
至此,Apple 完全与 GCC 了断。
Objective-C Class Properties 做为 Objective-C 新语法特性在 WWDC2016 What's New in LLVM 中公示,表示 Xcode 8 以后可使用这一新语法特性。
使用方式很简单:
class
flag@dynamic
to defer to runtimeclass
flag@interface MyType : NSObject
@property (class) NSString *someString;
@end
复制代码
NSLog(@"format string: %@", MyType.someString);
复制代码
@implementation MyType
static NSString *_someString = nil;
+ (NSString *)someString { return _someString; }
+ (void)setSomeString:(NSString *)newString { _someString = newString; }
@end
复制代码
@dynamic
to defer to runtime@implementation MyType
@dynamic (class) someString;
+ (BOOL)resolveClassMethod:(SEL) name {
...
}
@end
复制代码
笔者在作项目组件下沉时,遇到一个问题,正好适用于 Objective-C Class Properties 发挥:将要下沉的组件库中某系统类 Categroy 引用了业务层某方法。
业务层应该依赖于将要下沉的组件,而组件既然要下沉就不该该再反过来依赖上层业务实现!
按照常规思路,想要把上层业务中被依赖的部分一块儿随组件下沉,可是发现被依赖的部分虽然也属于一个较为基础的模块,不过此模块现阶段不作下沉...
后来通过组内大佬指点,使用 Objective-C Class Properties 解决了这个问题,即将上层业务被依赖的部分化做将要下沉组件依赖方系统类 Categroy 的 Class Properties。
Note: 在 Categroy 中写 Objective-C Class Properties 须要使用 Runtime 关联方法。
文章写得比较用心(是我我的的原创文章,转载请注明 lision.me/),若是发现错误会优先在个人 我的博客 中更新。若是有任何问题欢迎在个人微博 @Lision 联系我~
但愿个人文章能够为你带来价值~
补充~ 我建了一个技术交流微信群,想在里面认识更多的朋友!若是各位同窗对文章有什么疑问或者工做之中遇到一些小问题均可以在群里找到我或者其余群友交流讨论,期待你的加入哟~
Emmmmm..因为微信群人数过百致使不能够扫码入群,因此请扫描上面的二维码关注公众号进群。