关于OC 的Initialize

在于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.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改为:
  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 = [[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.
好了就这么多吧,大家共同学习。有不同见解,欢迎留言。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

边缘998

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值