先回顾一下静态变量与全局变量的一些知识。
头文件中定义全局变量和静态变量的区别。
头文件中定义全局变量,当该头文件被引用时,会产生1个全局变量的定义,当该头文件被多次引用时,会产生多个相同全局变量定义,会出现重复定义,所以不要将全局变量的定义写在头文件中。
头文件中定义静态变量,由于静态变量的作用域只存在于源文件中,所以没一个引用头文件的源文件会生成一个本源文件作用域的静态变量;不同源文件生成的静态变量不一样,不是重复定义。
源文件中定义全局变量和静态变量的区别。
源文件中定义的全局变量可以在其他头文件中通过extern globalvariable进行使用。
源文件中定义的静态变量不可以在其他文件中通过extern进行引用。
添加的类属性为非对象类型静态属性,比如int之类的数值型。
头文件: Foo.h
@interface Foo : NSObject
+ (int)getLaa;
+ (void)setLaa:(int)value;
@end
源文件:
#import "Foo.h"
static int laa; // laa既可以放在@implementation之内,又可以放在@implementation之外。
@implementation Foo
+ (int)getLaa {
return laa;
}
+ (void)setLaa:(int)value {
laa = value;
}
@end
添加的类属性为对象类型静态属性,比如NSObject的子类。
整数可以在编译器定义,但是Objective-C对象不可以,创建实例对象之前需要激活运行时系统,有些Objective-C对象也可以在编译期创建,比如NSString【参考Effective Objective-C 2.0中文版204页】。
所以需要使用+initialize方法来创建对象型静态变量。
头文件:
@interface Foo : NSObject
+ (int)getLaa;
+ (void)setLaa:(int)value;
+ (NSMutableArray *)getKSomeObjects;
+ (void)insertObjectToKSomeObjects:(id)object;
@end
源文件:
#import "Foo.h"
static int laa;
static NSMutableArray *kSomeObjects;
@implementation Foo
+ (void)initialize {
if (self == [Foo class]) {
kSomeObjects = [NSMutableArray new];
}
}
+ (int)getLaa {
return laa;
}
+ (void)setLaa:(int)value {
laa = value;
}
+ (NSMutableArray *)getKSomeObjects {
return kSomeObjects;
}
+ (void)insertObjectToKSomeObjects:(id)object {
[kSomeObjects addObject:object];
}
@end