想定义个可变数组在编译期初始化...正常全局状态初始化我们一般这样写
static const NSInteger kSearchInterval = 10;
static NSString * const uartServiceUUIDString = @"6E400001-B5A3-F393-E0A9-E50E24DCCA9E";
但是可变数组不行,
static NSMutableArray *kSomeArray = [NSMutableArray new];```
这样写编译器会报错,告诉你不应该在编译期定义。
既然不能在全局中定义,放在方法里总可以了吧
点进NSObject,找到两个方法,研究下
(void)load;
(void)initialize;```
+ (void) load
对于加入运行期系统中的每个类及分类来说,必定会调用此方法,而且仅调用一次。当包含类或分类的程序库载入系统时,就会执行此方法,就是应用程序启动的时候。
比较有意思的是load不遵从继承规则,如果某个类本身没实现load方法,那么不管其各级父类是否实现此方法,系统都不会调用。
load 方法务必实现的精简也就是要尽量减少其所执行的操作,整个应用程序在执行load方法时都会阻塞。
+ (void) initialize
对于每个类来说,该方法会在程序调用该类之前调用,且只调用一次。它是由运行期系统来调用的。
- 它是“懒加载”的,也就是说,只有当程序用到了相关类时,才会调用。如果某个类一直没有使用,那么其initialize方法一直不会运行。也就是说程序无须把每个类的initialize方法都执行一遍。而load方法不同,程序必须阻塞并等着所有类的load都执行完才继续。
- initialize方法与其他消息一样,如果某个类未实现它,而其父类实现了,那么会运行父类的代码。
对比两个方法得出结论:
load方法用起来比较危险,好像写什么都不好,仅仅可能调试程序用
initialize方法要好点,但是只应该用来设置内部数据。不应该调用其他方法,即便是本类自己的方法也别调用,那些方法稍后有可能添加更多功能
故 实现了initialize方法 在此方法里面初始化可变数组,搞定!搞定? 问题来了 我在这个方法里写了NSlog ,发现继承它的所有类都打印这个log了,即便子类没有实现这个方法。。
前面提到initialize方法是遵循继承法则的。所以当初始化子类时,由于并未覆写此方法,因而还要把父类的实现代码再运行一遍。鉴于此,应该在initialize方法里加条件判断:
static NSMutableArray *kSomeArray;
+(void)initialize{
if (self == [SomeBaseClass class]) {
NSLog(@"initialize %@ ", self);
kSomeArray = [NSMutableArray new];
}
}
到这应该算是OK了