先回顧一下靜態(tài)變量與全局變量的一些知識。
頭文件中定義全局變量和靜態(tài)變量的區(qū)別。
頭文件中定義全局變量,當(dāng)該頭文件被引用時(shí),會產(chǎn)生1個(gè)全局變量的定義,當(dāng)該頭文件被多次引用時(shí),會產(chǎn)生多個(gè)相同全局變量定義,會出現(xiàn)重復(fù)定義,所以不要將全局變量的定義寫在頭文件中。
頭文件中定義靜態(tài)變量,由于靜態(tài)變量的作用域只存在于源文件中,所以沒一個(gè)引用頭文件的源文件會生成一個(gè)本源文件作用域的靜態(tài)變量;不同源文件生成的靜態(tài)變量不一樣,不是重復(fù)定義。
源文件中定義全局變量和靜態(tài)變量的區(qū)別。
源文件中定義的全局變量可以在其他頭文件中通過extern globalvariable進(jìn)行使用。
源文件中定義的靜態(tài)變量不可以在其他文件中通過extern進(jìn)行引用。
添加的類屬性為非對象類型靜態(tài)屬性,比如int之類的數(shù)值型。
頭文件: Foo.h
@interface Foo : NSObject
+ (int)getLaa;
+ (void)setLaa:(int)value;
@end
源文件:
#import "Foo.h"
static int laa; // laa既可以放在@implementation之內(nèi),又可以放在@implementation之外。
@implementation Foo
+ (int)getLaa {
return laa;
}
+ (void)setLaa:(int)value {
laa = value;
}
@end
添加的類屬性為對象類型靜態(tài)屬性,比如NSObject的子類。
整數(shù)可以在編譯器定義,但是Objective-C對象不可以,創(chuàng)建實(shí)例對象之前需要激活運(yùn)行時(shí)系統(tǒng),有些Objective-C對象也可以在編譯期創(chuàng)建,比如NSString【參考Effective Objective-C 2.0中文版204頁】。
所以需要使用+initialize方法來創(chuàng)建對象型靜態(tài)變量。
頭文件:
@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