关于OC 的Initialize

来源:互联网 发布:阿里云api怎么使用 编辑:程序博客网 时间:2024/06/06 21:01
在于OC 一段时间后,突然间看到GOOGLE的一段代,引发我的一些想法,一直不知道OC还有这个,记得以前在用DELPHI的时候,每个PAS中可以添加两个全局函数

initializationfinalization 目的在于每个类在运行的时候就进行初始化在程序结束时执行finalization,但这与OC有点点不同的就在于,DELPHI的不是类函数class function(C++的说法,静态成员函数,类方法),OC的表现为类方法(+)。

下面用代码来看一下OC的initalize与init之间的半毛钱关系。

@interfact SuperA:NSObject
@end

//实现
  1. @implementation SuperA
  2.  
  3. +(void) initialize {
  4.         NSLog(@"SuperA initialize");
  5. }
  6.  
  7. -(void) init {
  8.         NSLog(@"SuperA init");
  9. }
  10. @end
然后在main方法中执行
  1. SuperA* sA1 = [[SuperA alloc] init];
  2. SuperA* sA2 = [[SuperA alloc] init];
  3. SuperA* sA3 = [[SuperA alloc] init];
可在控制台看到输出信息:

2013-11-04 11:03:25.871initialize_demo[40378:9b] SuperA initialize

2013-11-04 11:03:25.872initialize_demo[40378:9b]SuperA init

2013-11-04 11:03:25.873initialize_demo[40378:9b]SuperA init

2013-11-04 11:03:25.873initialize_demo[40378:9b]SuperA init


由上结果可以看到initalize不管实例化多少次,在一次程序运行中只执行一次。呵呵,有朋友是不是想说这可以作单例了?你猜对了,单例也可以使用这个方式来进行处理,只是写法与普通的写法有少少改变罢了。

再来看看子类中的initalize与父类之间有什么先后顺序:
 为更清晰效果:将initalize改为:
  1. +(void) initialize {
  2.         NSLog(@"initialize class:%@"[self class]);
  3. }

子类 :
  1. @interface SubA : SuperA
  2.  
  3. @end

 然后在Main中执行:
  1. SuperA* sA1 = [[SuperA alloc] init];
  2.         SuperA* sA2 = [[SuperA alloc] init];
  3.         SuperA* sA3 = [[SuperA alloc] init];
  4.        
  5.         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 = [[SubAalloc] init];

    

    SuperA* sA1 = [[SuperAalloc] init];

    SuperA* sA2 = [[SuperAalloc] init];

    SuperA* sA3 = [[SuperAalloc] 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.
好了就这么多吧,大家共同学习。有不同见解,欢迎留言。

原创粉丝点击