关于OC 的Initialize

来源:互联网 发布:经颅多普勒正常值数据 编辑:程序博客网 时间:2024/06/02 04: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.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 allocinit];

    

    SuperA* sA1 = [[SuperA allocinit];

    SuperA* sA2 = [[SuperA allocinit];

    SuperA* sA3 = [[SuperA allocinit];

同样的你也分别把父类,子类的 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.
好了就这么多吧,大家共同学习。有不同见解,欢迎留言。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 地垫粘地板了怎么办 棉麻衬衣皱了怎么办 麻料衣服烫皱了怎么办 在京东买一双奥康鞋没有防伪怎么办 足球鞋丁掉了一颗怎么办 鼻子有点大想变小该怎么办 阿勒泰小东沟风景区边防证怎么办 孩子上一年级了学习很差怎么办 孩子作息时间不规律怎么办 冬天冻脸怎么办小妙招 冬天冻脚怎么办小妙招 冬天脚冷怎么办小妙招 初中生不爱学习父母该怎么办 早孕办公室买新办公桌怎么办 一年级学生专注度差怎么办 pscs6界面字体太小怎么办 psd文件打不开程序错误怎么办 经常熬夜皮肤暗黄怎么办 炎症引起的经期不来怎么办 父母沉迷于炒股该怎么办 宝宝嘴周边红了怎么办 后背被嘴吸出牙印怎么办 宝宝嘴巴周围长湿疹怎么办 宝宝脸蛋都是红红的湿疹怎么办 药流药第一天晚上的忘吃怎么办 我有口臭不想出门怎么办 入职10天想辞职怎么办 提完辞职报告不想上班了怎么办 吃流产药出血少怎么办 新车漆被刮掉了怎么办 新车被别人撞了怎么办 新买的车被撞了怎么办 临时牌掉了一张怎么办 车子在停车场被刮了怎么办 金毛不想养了怎么办 gta5老是掉线怎么办ps4 养狗身上有味道怎么办 身上有异味怎么办%3f 花钱花多了后悔怎么办 想去当兵有纹身怎么办 爸家里人欺负我妈怎么办