面試題總結(jié)(二)

1. 在 dealloc 只釋放引用并解除監(jiān)聽(tīng)

永遠(yuǎn)不要自己去調(diào)用dealloc. 運(yùn)行期系統(tǒng)會(huì)在合適的時(shí)候調(diào)用, 根據(jù)性能需求我們需要在里面實(shí)現(xiàn)一些操作, 那么我們可以在dealloc里做些什么呢?

  • 釋放對(duì)象所擁有的所有引用, 不過(guò)ARC會(huì)自動(dòng)添加這些代碼, 不用擔(dān)心
  • 對(duì)象擁有的其他非OC對(duì)象也需要釋放(CoreFoundation對(duì)象就必須手動(dòng)釋放)\
  • 釋放原來(lái)的觀測(cè)行為: 注銷通知, 如果沒(méi)有及時(shí)注銷,就會(huì)向其發(fā)送通知, 可能導(dǎo)致程序崩潰.

舉個(gè)簡(jiǎn)單例子:

- (void)dealloc
{
      [[NSNotificationCenter defaultCenter] removeObserver:self];
}

尤其注意:
dealloc中不要調(diào)用其他方法, 因?yàn)檫@些方法都是異步的, 在回調(diào)方法中還要使用這些方法 那么很有可能當(dāng)前對(duì)象已經(jīng)被釋放了, 會(huì)導(dǎo)致程序崩潰.

2. 多用塊枚舉, 少用for循環(huán)

當(dāng)遍歷數(shù)據(jù)元素時(shí), 建議使用塊枚舉, 因?yàn)橄鄬?duì)于傳統(tǒng)的for循環(huán), 枚舉更加高效, 而且簡(jiǎn)潔, 還能獲取到用產(chǎn)痛for循環(huán)無(wú)法提供的值.

我們先看一下傳統(tǒng)的for循環(huán)遍歷

傳統(tǒng)for循環(huán)遍歷

NSArray *anArray = /* ... */;
for (int i = 0; i < anArray.count; i++) 
{ 
  id object = anArray[i]; 
  // Do something with 'object'
}

// Dictionary
NSDictionary *aDictionary = /* ... */;
NSArray *keys = [aDictionary allKeys];
for (int i = 0; i < keys.count; i++)
 { 
  id key = keys[i]; 
  id value = aDictionary[key]; 
  // Do something with 'key' and 'value'
}

// Set
NSSet *aSet = /* ... */;
NSArray *objects = [aSet allObjects];
for (int i = 0; i < objects.count; i++) 
{ 
  id object = objects[i]; 
  // Do something with 'object'
}

我們可以看到, 在遍歷Dictionary 和 Set 的時(shí)候, 用創(chuàng)建了數(shù)組, 雖然我們使用for循環(huán)遍歷達(dá)到了我們的目的, 但卻加大了系統(tǒng)的開(kāi)銷.

采用快速遍歷

NSArray *anArray = /* ... */;
for (id object in anArray) 
{ 
  // Do something with 'object'
}

// Dictionary
NSDictionary *aDictionary = /* ... */;
for (id key in aDictionary) 
{ 
  id value = aDictionary[key]; 
  // Do something with 'key' and 'value'
}

NSSet *aSet = /* ... */;
for (id object in aSet)
{ 
  // Do something with 'object'
}

這種快速遍歷要比傳統(tǒng)遍歷要簡(jiǎn)介易懂, 但缺點(diǎn)是無(wú)法方便獲取數(shù)組的下標(biāo).

利用基于塊(block)的遍歷


NSArray *array = @[@"a", @"b", @"c", @"d"];
[array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
     // Do something with 'objece'
     if (@"b") 
     {
         *stop = YES;//使迭代停
     }
}];

//Dictionary
NSDictionary *dic = @{@"a":@"1", @"b":@"2", @"c":@"3"};
[dic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
     //Do something with 'key' and 'obj'
     if (@"b") {
         *stop = YES;//使迭代停止
     }
 }];
    
//Set
NSSet *set = [NSSet setWithObjects:@"a", @"b", @"c", @"d", nil];
[set enumerateObjectsUsingBlock:^(id  _Nonnull obj, BOOL * _Nonnull stop) {
     //Do something with 'obj'
     if (@"b") {
         *stop = YES;//使迭代停止
     }
 }];

我們可以看到载庭,在使用塊進(jìn)行快速枚舉的時(shí)候蜀涨,我們可以不創(chuàng)建臨時(shí)數(shù)組佩脊。雖然語(yǔ)法上沒(méi)有快速枚舉簡(jiǎn)潔,但是我們可以獲得數(shù)組元素對(duì)應(yīng)的序號(hào),字典元素對(duì)應(yīng)的鍵值,而且陶夜,我們還可以隨時(shí)令遍歷終止。

利用快速枚舉和塊枚舉還有一個(gè)優(yōu)點(diǎn), 能夠修改塊的方法簽名

for (NSString *key in aDictionary) 
{ 
  NSString *object = (NSString*)aDictionary[key]; 
  // Do something with 'key' and 'object'
}

NSDictionary *aDictionary = /* ... */; 
[aDictionary enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop)
{ 
  // Do something with 'key' and 'obj'
}];

如果我們可以知道集合里的元素類型裆站,就可以修改簽名条辟。這樣做的好處是:可以讓編譯期檢查該元素是否可以實(shí)現(xiàn)我們想調(diào)用的方法黔夭,如果不能實(shí)現(xiàn),就做另外的處理羽嫡。這樣一來(lái)本姥,程序就能變得更加安全。

3. initialize 與 load 實(shí)現(xiàn)代碼

load 方法

  + (void)load

每個(gè)類和分類在運(yùn)行期時(shí)都會(huì)調(diào)用 load方法, 而且僅僅調(diào)用一次, 很多小伙伴喜歡在這里調(diào)用一些方法, 作者建議盡量不要在這里調(diào)用其他方法,尤其是使用其他的類杭棵。因?yàn)槊總€(gè)類載入程序庫(kù)的時(shí)機(jī)是不同的,如果該類調(diào)用了載入程序庫(kù)的類, 就會(huì)很危險(xiǎn).

initialize方法

+ (void) initialize;

這個(gè)類方法與load方法相似,區(qū)別是這個(gè)方法在程序首次調(diào)用這個(gè)類的時(shí)候調(diào)用(惰性調(diào)用),而且只調(diào)用一次(絕對(duì)不能主動(dòng)使用代碼調(diào)用).

下面看一下代碼執(zhí)行順序:

舉個(gè)例子:

 + (void)load
{
    NSLog(@"%@  load", self);
}

+ (void)initialize
{
    NSLog(@"%@  initialize", self);
}

- (void)viewDidLoad 
{
    [super viewDidLoad];
    
    NSLog(@"123456789");
}

控制臺(tái)打印結(jié)果

**2016-10-28 17:02:24.813 Practise[98589:1255983] ViewController  initialize
**2016-10-28 17:02:24.815 Practise[98589:1255983] ViewController  load
**2016-10-28 17:02:24.905 Practise[98589:1255983] 123456789

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末婚惫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子颜屠,更是在濱河造成了極大的恐慌辰妙,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甫窟,死亡現(xiàn)場(chǎng)離奇詭異密浑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)粗井,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門尔破,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人浇衬,你說(shuō)我怎么就攤上這事懒构。” “怎么了耘擂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵胆剧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我醉冤,道長(zhǎng)秩霍,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任蚁阳,我火速辦了婚禮铃绒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘螺捐。我一直安慰自己颠悬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布定血。 她就那樣靜靜地躺著赔癌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪澜沟。 梳的紋絲不亂的頭發(fā)上届榄,一...
    開(kāi)封第一講書(shū)人閱讀 52,793評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音倔喂,去河邊找鬼铝条。 笑死,一個(gè)胖子當(dāng)著我的面吹牛席噩,可吹牛的內(nèi)容都是我干的班缰。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼悼枢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼埠忘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起馒索,我...
    開(kāi)封第一講書(shū)人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤莹妒,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后绰上,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體旨怠,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年蜈块,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鉴腻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡百揭,死狀恐怖爽哎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情器一,我是刑警寧澤课锌,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站祈秕,受9級(jí)特大地震影響渺贤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜踢步,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一癣亚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧获印,春花似錦述雾、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鳍征,卻和暖如春黍翎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背艳丛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工匣掸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趟紊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓碰酝,卻偏偏與公主長(zhǎng)得像霎匈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子送爸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

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

  • iOS 面試題總結(jié)(一) 101. 修改下面的代碼: typedef enum{ UserSex_Man,User...
    AlaricMurray閱讀 1,695評(píng)論 0 6
  • 1. 什么是arc铛嘱?(arc是為了解決什么問(wèn)題誕生的?) 答:ARC 是 Automatic Reference ...
    Mrxiaowang閱讀 163評(píng)論 0 0
  • iOS面試題(二) 消息發(fā)送和轉(zhuǎn)發(fā)機(jī)制袭厂,SEL和IMP 消息發(fā)送轉(zhuǎn)載自黃龍輝消息發(fā)送和消息轉(zhuǎn)發(fā)機(jī)制 在Object...
    滄州寧少閱讀 207評(píng)論 0 0
  • 跡部景吾墨吓,冰帝的帝王,網(wǎng)球部部長(zhǎng)纹磺,霸道帖烘,華麗的帝王,遇見(jiàn)他后爽航,會(huì)有怎樣的結(jié)局呢蚓让?
    61acc24b8346閱讀 243評(píng)論 0 0
  • 昨晚聽(tīng)十點(diǎn)讀書(shū)會(huì)的音頻,主播講一位長(zhǎng)壽智者的故事讥珍,當(dāng)被討教他長(zhǎng)壽的秘訣历极,這位百歲老人笑答:他長(zhǎng)壽的秘訣就是生活...
    營(yíng)養(yǎng)私教西西閱讀 107評(píng)論 0 0