在于OC 一段时间后,突然间看到GOOGLE的一段代,引发我的一些想法,一直不知道OC还有这个,记得以前在用DELPHI的时候,每个PAS中可以添加两个全局函数
initialization和finalization 目的在于每个类在运行的时候就进行初始化在程序结束时执行finalization,但这与OC有点点不同的就在于,DELPHI的不是类函数class function(C++的说法,静态成员函数,类方法),OC的表现为类方法(+)。
下面用代码来看一下OC的initalize与init之间的半毛钱关系。
@interfact SuperA:NSObject
@end
//实现
-
@implementation
SuperA
-
-
+
(
void
)
initialize
{
-
NSLog
(@
"SuperA initialize"
);
-
}
-
-
-
(
void
)
init
{
-
NSLog
(@
"SuperA init"
);
-
}
-
@end
然后在main方法中执行
-
SuperA
* sA1
=
[
[
SuperA
alloc
]
init
];
-
SuperA
* sA2
=
[
[
SuperA
alloc
]
init
];
-
SuperA
* sA3
=
[
[
SuperA
alloc
]
init
];
可在控制台看到输出信息:
2013-11-04 11:03:25.871 initialize_demo[40378:9b] SuperA initialize
2013-11-04 11:03:25.872 initialize_demo[40378:9b] SuperA init
2013-11-04 11:03:25.873 initialize_demo[40378:9b] SuperA init
2013-11-04 11:03:25.873 initialize_demo[40378:9b] SuperA init
由上结果可以看到initalize不管实例化多少次,在一次程序运行中只执行一次。呵呵,有朋友是不是想说这可以作单例了?你猜对了,单例也可以使用这个方式来进行处理,只是写法与普通的写法有少少改变罢了。
再来看看子类中的initalize与父类之间有什么先后顺序:
为更清晰效果:将initalize改为:
-
+
(
void
)
initialize
{
-
NSLog
(@
"initialize class:%@",
[
self
class
]
);
-
}
子类 :
-
@interface SubA
: SuperA
-
-
@end
然后在Main中执行:
-
SuperA
* sA1
=
[
[
SuperA
alloc
]
init
];
-
SuperA
* sA2
=
[
[
SuperA
alloc
]
init
];
-
SuperA
* sA3
=
[
[
SuperA
alloc
]
init
];
-
-
SubA
* sb
=
[
[SubA
alloc
]
init
];
要以看到执行结果
2013-11-04 11:12:36.431 initialize_demo[40108:9b] initialize class:SuperA
2013-11-04 11:12:36.431 initialize_demo[40108:9b] SuperA init
2013-11-04 11:12:36.431 initialize_demo[40108:9b] SuperA init
2013-11-04 11:12:36.431 initialize_demo[40108:9b] SuperA init
2013-11-04 11:12:36.431 initialize_demo[40108:9b] initialize class:SubA
2013-11-04 11:12:36.431 initialize_demo[40108:9b] SubA init
哪从结果看是不是先执行父类再执行子类?非也,你把代码再改为。
SubA* sb = [[SubA alloc] init];
SuperA* sA1 = [[SuperA alloc] init];
SuperA* sA2 = [[SuperA alloc] init];
SuperA* sA3 = [[SuperA alloc] init];
同样的你也分别把父类,子类的 initalize进行注释了运行,你就会发现,initalize 父类与子类没有毛钱关系,只与对象实例有关系。也就是说每个类如果有initalize则会被CALL, 如果没有这个方法也不会在实化时调用父类。这点跟DELPHI还是很像的,只不过DELPHI是写成了全局的,跟类没有关系。
再来看一下单例的普通写法:
static className * instance = nil;
+ (className *)shareInstance
{
if (!instance)
{
instance = [[className alloc]init];
}
return instance;
}
当使用initalize进行单例时,
static className * instance = nil;
+ (void)initalize
{
if (!instance)
{
instance = [[className alloc]init];
}
}
+ (className *)shareInstance
{
return instance;
}
同样在调用时只需要执行shareInstance即可,不用担心实例是否被创建,因为在程序执行的时候就会自动执行一次initalize.
好了就这么多吧,大家共同学习。有不同见解,欢迎留言。