initialize的用法

Objective-C很有趣的一個(gè)地方是颁股,它非常非常像C星著。實(shí)際上特笋,它就是C語(yǔ)言加上一些其他擴(kuò)展和一個(gè)運(yùn)行時(shí)間(runtime)。

有了這個(gè)在每個(gè)Objective-C程序中都會(huì)起作用的附加運(yùn)行時(shí)間拢切,給了它一些動(dòng)態(tài)的特性蒂萎。C和C++沒(méi)有運(yùn)行時(shí)間,他們僅僅被編譯為完全按照代碼的順序去執(zhí)行淮椰,不多也不少五慈。
Objective-C中帶有運(yùn)行時(shí)間的好處是,它可以在你的程序運(yùn)行的流程中進(jìn)行參與主穗。在Objective-C中泻拦,它包括檢查是否一個(gè)對(duì)象可以處理特定的消息,如果不能處理忽媒,它就幫助你自動(dòng)調(diào)用其他特定的方法去完成争拐。

initialize不是init

運(yùn)行時(shí)間的行為之一就是initialize。雖然看起來(lái)有點(diǎn)像大家常見(jiàn)的init晦雨,但是他們并不相同架曹。

在程序運(yùn)行過(guò)程中,它會(huì)在你程序中每個(gè)類(lèi)調(diào)用一次initialize金赦。這個(gè)調(diào)用的時(shí)間發(fā)生在你的類(lèi)接收到消息之前,但是在它的超類(lèi)接收到initialize之后对嚼。

舉個(gè)例子夹抗,比如一個(gè)叫做Duck的類(lèi):

#import "Duck.h";
 
@implementation Duck
 
+(void) initialize {
    NSLog(@"Duck initialize");
}
 
-(void) init {
    NSLog(@"Duck init");
}
@end

我們?cè)谶@里記錄initialize和init調(diào)用的時(shí)間。

我們建立三個(gè)Duck對(duì)象的實(shí)例:

NSLog(@"Hello, World!");

Duck* duck1 = [[Duck alloc] init];

Duck* duck2 = [[Duck alloc] init];

Duck* duck3 = [[Duck alloc] init];

看一下記錄:

[Session started at 2008-03-23 20:03:25 -0400.]

2008-03-23 20:03:25.869 initialize_example[30253:10b] Hello, World!

2008-03-23 20:03:25.871 initialize_example[30253:10b] Duck initialize

2008-03-23 20:03:25.872 initialize_example[30253:10b] Duck init

2008-03-23 20:03:25.873 initialize_example[30253:10b] Duck init

2008-03-23 20:03:25.873 initialize_example[30253:10b] Duck init

我們可以看到纵竖,雖然我們創(chuàng)建了3個(gè)Duck的實(shí)例漠烧,但是initialize僅僅被調(diào)用了一次。我們也可以看到靡砌,直到我們創(chuàng)建了一個(gè)Duck的實(shí)例已脓,initialize才被調(diào)用。

但是如果Duck有一個(gè)子類(lèi)的話(huà)通殃,比如我們建一個(gè)Duck的子類(lèi)叫做Chicken(好怪異……)

#import <cocoa/Cocoa.h>

#import "Duck.h"
 
@interface Chicken : Duck {
 
}
 
@end

注意Chicken這個(gè)類(lèi)并沒(méi)有實(shí)現(xiàn)initialize方法度液。

如果我們同樣運(yùn)行這個(gè)程序,但是加上一個(gè)Chicken的實(shí)例:

NSLog(@"Hello, World!");

Duck* duck1 = [[Duck alloc] init];
Duck* duck2 = [[Duck alloc] init];
Duck* duck3 = [[Duck alloc] init];
     
Chicken* chicken = [[Chicken alloc] init];

我們期待看到4個(gè)Duck的init調(diào)用(因?yàn)槲覀兘⒘?個(gè)Duck和一個(gè)Chicken)画舌,但是我們看到了這樣情況:

[Session started at 2008-03-23 20:13:34 -0400.]

2008-03-23 20:13:34.696 initialize_example[30408:10b] Hello, World!

2008-03-23 20:13:34.698 initialize_example[30408:10b] Duck initialize

2008-03-23 20:13:34.699 initialize_example[30408:10b] Duck init

2008-03-23 20:13:34.700 initialize_example[30408:10b] Duck init

2008-03-23 20:13:34.700 initialize_example[30408:10b] Duck init

2008-03-23 20:13:34.700 initialize_example[30408:10b] Duck initialize

2008-03-23 20:13:34.701 initialize_example[30408:10b] Duck init

我們看到了4個(gè)Duck的init和2個(gè)Duck的initialize方法堕担。這是怎么回事呢?

看來(lái)如果一個(gè)子類(lèi)沒(méi)有實(shí)現(xiàn)initialize方法曲聂,那么超類(lèi)會(huì)調(diào)用這個(gè)方法兩次霹购,一次為自己,而一次為子類(lèi)朋腋。

我們?cè)贒uck的initialize類(lèi)中記錄一下類(lèi)名齐疙,這樣可以看得更清楚:

+(void) initialize {
NSLog(@"Duck initialize class:%@",[self class]);
}

現(xiàn)在看明白了:

[Session started at 2008-03-23 20:21:08 -0400.]

2008-03-23 20:21:08.816 initialize_example[30513:10b] Hello, World!

2008-03-23 20:21:08.818 initialize_example[30513:10b] Duck initialize class:Duck

2008-03-23 20:21:08.819 initialize_example[30513:10b] Duck init

2008-03-23 20:21:08.820 initialize_example[30513:10b] Duck init

2008-03-23 20:21:08.820 initialize_example[30513:10b] Duck init

2008-03-23 20:21:08.820 initialize_example[30513:10b] Duck initialize class:Chicken

2008-03-23 20:21:08.821 initialize_example[30513:10b] Duck init

如果你希望確定只用了initialize一次用來(lái)實(shí)現(xiàn)某些單獨(dú)運(yùn)行的工作膜楷,或者希望實(shí)現(xiàn)僅僅運(yùn)行一次的方法,檢查一下[self class]贞奋,才能確定是否是你希望做到的效果赌厅。

原文地址:http://blog.csdn.net/ajrm0925/article/details/7431982/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市忆矛,隨后出現(xiàn)的幾起案子察蹲,更是在濱河造成了極大的恐慌,老刑警劉巖催训,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洽议,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡漫拭,警方通過(guò)查閱死者的電腦和手機(jī)亚兄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)采驻,“玉大人审胚,你說(shuō)我怎么就攤上這事±衤茫” “怎么了苗胀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)佃声。 經(jīng)常有香客問(wèn)我虏辫,道長(zhǎng),這世上最難降的妖魔是什么汰翠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任龄坪,我火速辦了婚禮,結(jié)果婚禮上复唤,老公的妹妹穿的比我還像新娘健田。我一直安慰自己,他們只是感情好佛纫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布妓局。 她就那樣靜靜地躺著,像睡著了一般呈宇。 火紅的嫁衣襯著肌膚如雪跟磨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,856評(píng)論 1 290
  • 那天攒盈,我揣著相機(jī)與錄音抵拘,去河邊找鬼。 笑死型豁,一個(gè)胖子當(dāng)著我的面吹牛僵蛛,可吹牛的內(nèi)容都是我干的尚蝌。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼充尉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼飘言!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起驼侠,我...
    開(kāi)封第一講書(shū)人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤姿鸿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后倒源,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體苛预,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年笋熬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了热某。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胳螟,死狀恐怖昔馋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情糖耸,我是刑警寧澤秘遏,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布,位于F島的核電站嘉竟,受9級(jí)特大地震影響邦危,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜周拐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一铡俐、第九天 我趴在偏房一處隱蔽的房頂上張望凰兑。 院中可真熱鬧妥粟,春花似錦、人聲如沸吏够。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锅知。三九已至播急,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間售睹,已是汗流浹背桩警。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昌妹,地道東北人捶枢。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓握截,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親烂叔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谨胞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • Objective-C很有趣的一個(gè)地方是,它非常非常像C蒜鸡。實(shí)際上胯努,它就是C語(yǔ)言加上一些其他擴(kuò)展和一個(gè)運(yùn)行時(shí)間(ru...
    IceWall_Rin閱讀 320評(píng)論 0 0
  • 100:00:00,000 --> 00:00:00,110 200:00:00,110 --> 00:00:03...
    造物家英語(yǔ)閱讀 973評(píng)論 0 0
  • 曾經(jīng)有一份美好的愛(ài)情放在我的面前我沒(méi)有珍惜胞四。等到失去后才后悔莫及恬汁。如果可以再對(duì)小李說(shuō)。毛欣想說(shuō)辜伟。這輩子無(wú)緣再牽手氓侧。...
    毛欣與小李閱讀 2,583評(píng)論 0 13
  • 今天弟弟給我發(fā)信息,問(wèn)我深圳現(xiàn)在的天氣情況怎么樣导狡。一大段的寒暄過(guò)后约巷,弟弟告訴我,爸媽去香港游玩了旱捧。我很詫異独郎,為什么...
    summer1210閱讀 235評(píng)論 0 2
  • Block 的語(yǔ)法 依稀記得自己第一眼看到 Block 的時(shí)候一臉懵逼的樣子,接著是第二次枚赡,第三次氓癌,每次出現(xiàn)的樣子...
    SmallflyBlog閱讀 270評(píng)論 0 1