iOS面試題(上)

面試題1

  1. 定義屬性時(shí), 什么情況使用copy, assignretain?

property關(guān)鍵字:readonly, readwrite, assign, retain, copy, nonatomic, strong, weak, unsafe_unretained

readwrite此標(biāo)記說(shuō)明屬性會(huì)被當(dāng)成讀寫(xiě)的奕纫,這也是默認(rèn)屬性青团。設(shè)置器和讀取器都需要在@implementation中實(shí)現(xiàn)逞度。如果使用@synthesize關(guān)鍵字,讀取器和設(shè)置器都會(huì)被解析季二。

readonly此標(biāo)記說(shuō)明屬性是只讀的桦锄,默認(rèn)的標(biāo)記是讀寫(xiě)辛润,如果你指定了只讀表制,在@implementation中只需要一個(gè)讀取器÷癖茫或者如果你使用@synthesize關(guān)鍵字幔欧,也是有讀取器方法被解析。而且如果你試圖使用點(diǎn)操作符為屬性賦值丽声,你將得到一個(gè)編譯錯(cuò)誤礁蔗。

assign: 賦值特性=(僅設(shè)置變量時(shí), setter方法將傳入?yún)?shù)賦值給實(shí)例變量), 一般常用于基本數(shù)據(jù)類(lèi)型, 常見(jiàn)委托設(shè)計(jì)模式, 以此來(lái)防止循環(huán)引用.
assigin 可以用非 OC 對(duì)象,而 weak 必須用于 OC 對(duì)象

retain: 持有特性, 保留計(jì)數(shù), 獲得到對(duì)象的所有權(quán), 引用計(jì)數(shù)(reference counting)在原有的基礎(chǔ)上+1
例如當(dāng)使用malloc分配了一塊內(nèi)存,并把它的地址賦值給了指針a雁社,后來(lái)如果希望指針b也共享這塊內(nèi)存瘦麸,于是講a賦值給(assgin)b。這時(shí)就用到了assgin歧胁,此時(shí)a和b指向同一塊內(nèi)存滋饲。但是現(xiàn)在問(wèn)題出現(xiàn)了厉碟,當(dāng)a不再需要這塊內(nèi)存時(shí),能都直接釋放呢屠缭?肯定是不能的箍鼓,因?yàn)閍并不知道b是否還在使用這塊內(nèi)存,如果a釋放了呵曹,那么b在使用這塊內(nèi)存的時(shí)候引起程序crash

copy:是你不希望a和b共享一塊內(nèi)存時(shí)會(huì)使用到款咖。a和b各自有自己的內(nèi)存。(引申出深拷貝, 淺拷貝)

NSString屬性什么時(shí)候用copy奄喂,什么時(shí)候用strong?
iOS 集合的深復(fù)制與淺復(fù)制
對(duì)于字符串铐殃,通常都是使用copy的方式昙啄。雖然使用strong似乎也沒(méi)有沒(méi)有問(wèn)題崇裁,但是事實(shí)上在開(kāi)發(fā)中都會(huì)使用copy鞋仍。為什么這么做贝咙?因?yàn)閷?duì)于字符串,我們希望是一次內(nèi)容的拷貝碌识,外部修改也不會(huì)影響我們的原來(lái)的值衰伯,而且NSString類(lèi)遵守了NSCopying, NSMutableCopying, NSSecureCoding協(xié)議瞧剖。
下面是使用copy的方式肖揣,驗(yàn)證如下:

NSString *hahaString = @"哈哈"; 
NSString *heheString = [hahaString copy]; 
// 哈哈, 哈哈 
NSLog(@"%@, %@", hahaString, heheString); 
heheString = @"呵呵"; 
// 哈哈, 呵呵 
NSLog(@"%@, %@", hahaString, heheString);

我們修改了heheString民假,并不會(huì)影響到原來(lái)的hahaStringcopy一個(gè)對(duì)象變成新的對(duì)象(新內(nèi)存地址) 引用計(jì)數(shù)+1 原對(duì)象計(jì)數(shù)不變龙优。

nonatomic:非原子性訪(fǎng)問(wèn)羊异,對(duì)屬性賦值的時(shí)候不加鎖,多線(xiàn)程并發(fā)訪(fǎng)問(wèn)會(huì)提高性能彤断。如果不加此屬性野舶,則默認(rèn)是兩個(gè)訪(fǎng)問(wèn)方法都為原子性訪(fǎng)問(wèn)。
atomicObjc使用的一種線(xiàn)程保護(hù)技術(shù)瓦糟,基本上來(lái)講筒愚,是防止在寫(xiě)未完成的時(shí)候被另外一個(gè)線(xiàn)程讀取赴蝇,造成數(shù)據(jù)錯(cuò)誤菩浙。而這種機(jī)制是耗費(fèi)系統(tǒng)資源的,所以在iPhone這種小型設(shè)備上句伶,如果沒(méi)有使用多線(xiàn)程間的通訊編程劲蜻,那么nonatomic是一個(gè)非常好的選擇

strong, weak, unsafe_unretainedARC引入的

strong:相當(dāng)于retain,但是對(duì)于有的類(lèi)型考余,例如NSString先嬉,則使用strong相當(dāng)于使用copy這樣直接用strong就可以直接處理retainstrong的情況了。

weak:相當(dāng)于assign楚堤,但是比后者多一點(diǎn):對(duì)象被銷(xiāo)毀時(shí)會(huì)將weak引用設(shè)為nil疫蔓,而對(duì)nil發(fā)送消息都不會(huì)導(dǎo)致崩潰否則weak引用為野指針含懊,會(huì)出現(xiàn)問(wèn)題.

unsafe_unretained:用unsafe_unretained聲明的指針,指針指向的對(duì)象一旦被釋放衅胀,這些指針將成為野指針岔乔。

使用@property配合@synthesize可以讓編譯器自動(dòng)實(shí)現(xiàn)getter/setter方法,使用的時(shí)候也很方便滚躯,可以直接使用“對(duì)象.屬性”的方法調(diào)用;如果我們想要”對(duì)象.方法“的方式來(lái)調(diào)用一個(gè)方法并獲取到方法的返回值雏门,那就需要使用@property配合@dynamic
使用@dynamic關(guān)鍵字是告訴編譯器由我們自己來(lái)實(shí)現(xiàn)訪(fǎng)問(wèn)方法。如果使用的是@synthesize掸掏,那么這個(gè)工作編譯器就會(huì)幫你實(shí)現(xiàn)了

2.怎樣啟動(dòng)一個(gè)新線(xiàn)程, 子線(xiàn)程怎樣刷新UI?

刷新UI
方法1:

[self performSelectorOnMainThread:@selector(updateUI:) withObject:nil waitUntilDone:YES];

方法2:

dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
// 處理耗時(shí)操作的代碼塊... 

  //通知主線(xiàn)程刷新  
  dispatch_async(dispatch_get_main_queue(), ^{ 
  //回調(diào)或者說(shuō)是通知主線(xiàn)程刷新茁影,  

  }); 
});

3.KVO是什么? ?內(nèi)部是怎樣實(shí)現(xiàn)的?

KVO是實(shí)現(xiàn)Cocoa Bindings的基礎(chǔ), 它提供了一種方法, 當(dāng)某個(gè)屬性改變時(shí), 相應(yīng)的objects會(huì)被通知到. 在其他語(yǔ)言中, 這種觀(guān)察者模式通常需要單獨(dú)實(shí)現(xiàn), 而在OC中, 通常無(wú)須增加額外代碼即可使用.

實(shí)現(xiàn): 通過(guò)Objective-C強(qiáng)大的運(yùn)行時(shí)(runtime)實(shí)現(xiàn)的. 當(dāng)你第一次觀(guān)察某個(gè)object時(shí), runtime會(huì)創(chuàng)建一個(gè)新的繼承原先class的subclass, 在這個(gè)新的class中, 它重寫(xiě)了所有被觀(guān)察的key, 然后將object的isa指針指向新創(chuàng)建的class(這個(gè)指針告訴Objective-C運(yùn)行時(shí)某個(gè)object到底是哪種類(lèi)型的object). 所以object神奇的變成了新的子類(lèi)的實(shí)例.

這些被重寫(xiě)的方法實(shí)現(xiàn)了如何通知觀(guān)察者們。當(dāng)改變一個(gè)key時(shí)丧凤,會(huì)觸發(fā)setKey方法募闲,但這個(gè)方法被重寫(xiě)了,并且在內(nèi)部添加了發(fā)送通知機(jī)制息裸。(當(dāng)然也可以不走setXXX方法蝇更,比如直接修改iVar,但不推薦這么做)呼盆。

有意思的是:蘋(píng)果不希望這個(gè)機(jī)制暴露在外部年扩。除了setters,這個(gè)動(dòng)態(tài)生成的子類(lèi)同時(shí)也重寫(xiě)了-class方法访圃,依舊返回原先的class厨幻!如果不仔細(xì)看的話(huà),被KVO過(guò)的object看起來(lái)和原先的object沒(méi)什么兩樣腿时。

KVO依賴(lài)于NSObject 的兩個(gè)方法: willChangeValueForKey: 和didChangevlueForKey:;在一個(gè)被觀(guān)察屬性發(fā)生改變之前况脆, willChangeValueForKey: 一定會(huì)被調(diào)用,這就 會(huì)記錄舊的值批糟。而當(dāng)改變發(fā)生后格了,didChangeValueForKey: 會(huì)被調(diào)用,繼而 observeValueForKey:ofObject:change:context: 也會(huì)被調(diào)用徽鼎。
原博客鏈接

4.寫(xiě)出對(duì)所有類(lèi)進(jìn)行擴(kuò)展的幾種方式.
類(lèi)目, 延展, 協(xié)議, 繼承

5.利用 NSOperationNSOperationQueue 處理多線(xiàn)程時(shí), 有3個(gè) NSOperation 分別為A, B, C, 要求A, B執(zhí)行完之后, 才執(zhí)行 C, 如何做?

// 創(chuàng)建隊(duì)列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
// 創(chuàng)建3個(gè)操作
// 同步執(zhí)行一個(gè)操作
NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{
  NSLog(@"a");
}];
NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{
  NSLog(@"b");
}];
NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{
  NSLog(@"c");
}];
    
[b addDependency:a];
[c addDependency:b];
    
[queue addOperation:a];
[queue addOperation:b];
[queue addOperation:c];

6.構(gòu)造5個(gè) string 對(duì)象, 并添加到數(shù)組中, 對(duì) array 中的元素按字母排序, 遍歷 array 輸出 string 內(nèi)容



NSMutableArray *arr = @[@"qda", @"adsg", @"rwf", @"wrwev", @"vbwer"].mutableCopy;
    arr = [arr sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)].mutableCopy;
    for (NSString *str in arr) {
        NSLog(@"%@", str);
    }

面試題2

1.該函數(shù)輸出是什么?

main()
{
  int a[5] = {1, 2, 3, 4, 5};
  int *ptr = (int *)(&a + 1);
  printf("%d, %d", *(a+1), *(ptr - 1));
}

輸出:2, 5

2.有一個(gè)1G大小的一個(gè)文件, 里面每一行是一個(gè)詞, 詞的大小不超過(guò)16字節(jié).
內(nèi)存限制大小是1M, 返回頻數(shù)里面最高的100個(gè)詞.

3.HTTP 協(xié)議 1xx, 2xx, 3xx, 4xx, 5xx的含義. 204, 304的含義

HTTP狀態(tài)碼是五個(gè)不同的類(lèi)別:

  • 1XX臨時(shí)/信息響應(yīng)
  • 2XX成功
  • 3XX重定向
  • 4XX客戶(hù)端/請(qǐng)求錯(cuò)誤
  • 5XX服務(wù)器錯(cuò)誤

204(無(wú)內(nèi)容): 服務(wù)器成功處理了請(qǐng)求盛末,但沒(méi)有返回任何內(nèi)容。
304(未修改): 自從上次請(qǐng)求后否淤,請(qǐng)求的網(wǎng)頁(yè)未修改過(guò)悄但。服務(wù)器返回此響應(yīng)時(shí),不會(huì)返回網(wǎng)頁(yè)內(nèi)容石抡。
如果網(wǎng)頁(yè)自請(qǐng)求者上次請(qǐng)求后再也沒(méi)有更改過(guò)檐嚣,您應(yīng)將服務(wù)器配置為返回此響應(yīng)(稱(chēng)為 If-Modified-Since HTTP 標(biāo)頭)。服務(wù)器可以告訴 Googlebot 自從上次抓取后網(wǎng)頁(yè)沒(méi)有變更啰扛,進(jìn)而節(jié)省帶寬和開(kāi)銷(xiāo)嚎京。
4.給出 cocoa touch 框架

Cocoa Touch框架
除 UIKit 之外嗡贺,Cocoa Touch 包含創(chuàng)建世界一流 iOS 應(yīng)用程序所需的所有框架,從 3D 圖形鞍帝、專(zhuān)業(yè)音頻到網(wǎng)絡(luò)暑刃,甚至提供特殊設(shè)備訪(fǎng)問(wèn) API 以控制攝像機(jī)或從 GPS 硬件獲取位置。Cocoa Touch 既包含只需要幾行代碼就可以完成全部任務(wù)的強(qiáng)大的 Objective-C 框架膜眠,也在需要時(shí)提供基礎(chǔ)的 C 語(yǔ)言 API 來(lái)直接訪(fǎng)問(wèn)系統(tǒng)岩臣。這些框架示例包括:

  • 通過(guò) Core Animation,您就可以通過(guò)基于組合獨(dú)立圖層的簡(jiǎn)單編程模型來(lái)創(chuàng)建豐富的用戶(hù)體驗(yàn)宵膨。
  • Core Audio 是播放架谎、處理和錄制音頻的專(zhuān)業(yè)級(jí)技術(shù),能夠輕松為您的應(yīng)用程序添加強(qiáng)大的音頻功能辟躏。
  • Core Data 提供面向?qū)ο蟮臄?shù)據(jù)管理解決方案谷扣,該方案易于使用和理解,甚至可處理任何應(yīng)用或大或小的數(shù)據(jù)模型捎琐。

拓展:
iphone 技術(shù)層
Cocoa Touch 層由多個(gè)框架組成会涎,他們?yōu)閼?yīng)用程序提供了核心功能。
UIKit 負(fù)責(zé)啟動(dòng)和結(jié)束應(yīng)用程序瑞凑,控制界面和多觸點(diǎn)事件
Map Kit 提供地圖的相關(guān)服務(wù)末秃,定位或者區(qū)域檢測(cè)等
Game Kit 創(chuàng)建和使用網(wǎng)絡(luò)機(jī)制
Message UI/Address Book UI 提供操作電子郵件和聯(lián)系人的信息

5.用OC, 自己實(shí)現(xiàn)一個(gè) AutoReleasePool.

6.NSThread, NSOperation, GCD, 各有什么特點(diǎn), 使用需要注意什么?

NSThread.
每個(gè)NSThread對(duì)象對(duì)應(yīng)一個(gè)線(xiàn)程,量級(jí)較輕(真正的多線(xiàn)程)
NSThree是官方推薦的線(xiàn)程處理方式籽御,它在處理機(jī)制上练慕,需要開(kāi)發(fā)者負(fù)責(zé)手動(dòng)管理Thread的生命周期,包括子線(xiàn)程與主線(xiàn)程之間的同步等技掏。線(xiàn)程共享同一應(yīng)用程序的部分內(nèi)存空間铃将,它們擁有對(duì)數(shù)據(jù)相同的訪(fǎng)問(wèn)權(quán)限。你得協(xié)調(diào)多個(gè)線(xiàn)程 對(duì)同一數(shù)據(jù)的訪(fǎng)問(wèn)哑梳,一般做法是在訪(fǎng)問(wèn)之前加鎖劲阎,這會(huì)導(dǎo)致一定的性能開(kāi)銷(xiāo)。在 iOS 中我們可以使用多種形式的 thread鸠真。 比其他兩個(gè)輕量級(jí) 需要自己管理線(xiàn)程的生命周期悯仙,線(xiàn)程同步。 線(xiàn)程同步對(duì)數(shù)據(jù)的加鎖會(huì)有一定的系統(tǒng)開(kāi)銷(xiāo).

NSOperation/NSOperationQueue 面向?qū)ο蟮木€(xiàn)程技術(shù)
如果需要讓線(xiàn)程同時(shí)并行運(yùn)行多個(gè)弧哎,可以將線(xiàn)程加入隊(duì)列(Queue)中雁比,NSOperationQueue類(lèi)就是一個(gè)線(xiàn)程隊(duì)列管理類(lèi)稚虎,他提供了線(xiàn)程并行撤嫩、隊(duì)列的管理〈乐眨可以認(rèn)為NSOperationQueue就是一個(gè)線(xiàn)程管理器序攘,通過(guò)addOperations方法茴她,我們可以一次性把多個(gè)(數(shù)組形式)線(xiàn)程添加到隊(duì)列中。同時(shí)程奠,NSOperationQueue允許通過(guò)setMaxConcurrentOperationCount方法設(shè)置隊(duì)列的并行(同一時(shí)間)運(yùn)行數(shù)量

Grand Central Dispatch (GCD)是Apple開(kāi)發(fā)的一個(gè)多核編程的解決方法丈牢。該方法在Mac OS X 10.6雪豹中首次推出,并隨后被引入到了iOS4.0中瞄沙。GCD是一個(gè)替代諸如NSThread, NSOperationQueue, NSInvocationOperation等技術(shù)的很高效和強(qiáng)大的技術(shù)己沛,它看起來(lái)象就其它語(yǔ)言的閉包(Closure)一樣,但蘋(píng)果把它叫做blocks距境。
GCD —— Grand Central Dispatch(大調(diào)度中心) 是基于C語(yǔ)言的框架申尼,可以充分利用多核,是蘋(píng)果推薦使用的多線(xiàn)程技術(shù)
以上這三種編程方式從上到下垫桂,抽象度層次是從低到高的师幕,抽象度越高的使用越簡(jiǎn)單,也是Apple最推薦使用的诬滩,在項(xiàng)目中很多框架技術(shù)分別使用了不同多線(xiàn)程技術(shù)霹粥。

三種多線(xiàn)程技術(shù)的對(duì)比                          
NSThread:–優(yōu)點(diǎn):NSThread 比其他兩個(gè)輕量級(jí),使用簡(jiǎn)單–缺點(diǎn):需要自己管理線(xiàn)程的生命周期疼鸟、線(xiàn)程同步后控、加鎖、睡眠以及喚醒等空镜。線(xiàn)程同步對(duì)數(shù)據(jù)的加鎖會(huì)有一定的系統(tǒng)開(kāi)銷(xiāo)

NSOperation:不需要關(guān)心線(xiàn)程管理忆蚀,數(shù)據(jù)同步的事情,可以把精力放在自己需要執(zhí)行的操作上–NSOperation是面向?qū)ο蟮?/p>

  • 優(yōu)點(diǎn): 提供了一些在GCD中不容易實(shí)現(xiàn)的特性,如:限制最大并發(fā)數(shù)量,操作之間的依賴(lài)關(guān)系.

GCD:NSOperation的高效和強(qiáng)大的技術(shù)–GCD是基于C語(yǔ)言的

  • 優(yōu)點(diǎn)1:用Block定義任務(wù),使用起來(lái)非常靈活便捷;(要注意:也可能出現(xiàn)循環(huán)引用)
  • 優(yōu)點(diǎn)2:提供了更多的控制能力以及操作隊(duì)列中所不能使用的底層函數(shù).

7.分別介紹下 KVO, KVC, NOtification, Delegate 使用場(chǎng)景.

iOS 如何選擇delegate姑裂、notification馋袜、KVO?

KVC舶斧,即是指 NSKeyValueCoding欣鳖,一個(gè)非正式的Protocol,提供一種機(jī)制來(lái)間接訪(fǎng)問(wèn)對(duì)象的屬性茴厉。而不是通過(guò)調(diào)用Setter泽台、Getter方法訪(fǎng)問(wèn)。KVO 就是基于 KVC 實(shí)現(xiàn)的關(guān)鍵技術(shù)之一矾缓。
盡量使用KVC可以大大地減少我們的代碼量怀酷,當(dāng)遇到property的時(shí)候,可以多想想是否可以KVC來(lái)幫助我嗜闻,是否可以用KVC來(lái)重構(gòu)代碼蜕依, 當(dāng)需要加入observer模式時(shí),可以考慮下KVO, 在高性能的observer里面,KVO會(huì)給我們很好的幫助样眠。

8.在 - (void)scrollViewDidScroll:(UIScrollView *)scrollView 如何判斷滾動(dòng)是用戶(hù)手動(dòng)引發(fā)的.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (UIGestureRecognizerStateBegan == scrollView.panGestureRecognizer.state) {
        NSLog(@"手動(dòng)發(fā)出");
    }
}

面試題3

1.下面的代碼循環(huán)了幾次?

int i = 0;
while(i < 6) {
if(i == 5) {
  continue;
  }  
  i++;
}

死循環(huán)

2.UITextFieldUITextView 有什么區(qū)別?

UITextField:
1.UITextField只能單行輸入
2.有placehoder屬性設(shè)置占位文字
3.繼承自UIControl
4.監(jiān)聽(tīng)行為包括:

  • 1> 設(shè)置代理
  • 2> addTarget:action:forControlEvents:
  • 3> 通知:UITextFieldTextDidChangeNotification

UITextView:
1.支持多行輸入并且可以滾動(dòng)顯示瀏覽全文
2.不能設(shè)置占位文字
3.繼承自UIScollView
4.監(jiān)聽(tīng)行為包括:

  • 1> 設(shè)置代理
  • 2> 通知:UITextViewTextDidChangeNotification

3.把一段文本用你已知的控件顯示兩種顏色? 盡可能說(shuō)出你的方法.

方法1:NSAttributedString/NSMutableAttributedString

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"我們結(jié)婚吧"];
    [str addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, 2)];
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 50, 50)];
    [self.view addSubview:label];
    label.attributedText = str;

4.objc 中向一個(gè) nil 對(duì)象發(fā)送消息將會(huì)發(fā)生什么?

在 Objective-C 中向 nil 發(fā)送消息是完全有效的——只是在運(yùn)行時(shí)不會(huì)有任何作用:
如果一個(gè)方法返回值是一個(gè)對(duì)象友瘤,那么發(fā)送給nil的消息將返回0(nil)。例如:

Person * motherInlaw = [[aPerson spouse] mother];

如果 spouse 對(duì)象為 nil檐束,那么發(fā)送給 nil 的消息 mother 也將返回 nil辫秧。

如果方法返回值為指針類(lèi)型,其指針大小為小于或者等于sizeof(void*)被丧,float盟戏,double,long double 或者 long long 的整型標(biāo)量甥桂,發(fā)送給 nil 的消息將返回0抓半。
如果方法返回值為結(jié)構(gòu)體,發(fā)送給 nil 的消息將返回0。結(jié)構(gòu)體中各個(gè)字段的值將都是0格嘁。
如果方法的返回值不是上述提到的幾種情況笛求,那么發(fā)送給 nil 的消息的返回值將是未定義的。

5.有這樣一段 json 數(shù)據(jù): {"title":null}, 轉(zhuǎn)成字典之后將 title 對(duì)應(yīng)的 value 賦值在一個(gè)
label.text, 會(huì)出現(xiàn)什么問(wèn)題?
將該數(shù)據(jù)解析之后數(shù)據(jù)變?yōu)?/p>

title = <null>

這個(gè)數(shù)據(jù)類(lèi)型不是nil 也不是 String糕簿。 解析成對(duì)象之后探入,如果直接向這個(gè)對(duì)象發(fā)送消息(eg:length,count 等等)就會(huì)直接崩潰懂诗。提示錯(cuò)誤為:


-[NSNull length]: unrecognized selector sent to instance 0x388a4a70

解決方案

6.一個(gè)列表有足夠多的顯示區(qū)域, 滑動(dòng)了一下, 如何判斷向上滑動(dòng)還是向下滑動(dòng)了? 請(qǐng)?jiān)敿?xì)說(shuō)明.

int _lastPosition;  //臨時(shí)值
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    int currentPostion = scrollView.contentOffset.y;
    
    if (currentPostion - _lastPosition > 0) {
        _lastPosition = currentPostion;
        NSLog(@"ScrollUp now");
    }
    else if (_lastPosition - currentPostion > 0)
    {
        _lastPosition = currentPostion;
        NSLog(@"ScrollDown now");
    }
}

7.有兩個(gè)字符串 @"hello", @"world", 你有幾種方法將它們拼接在一起?

NSString* string1, string2; //已存在的字符串蜂嗽,需要將string1和string2連接起來(lái)
//方法1.
string = [NSString initWithFormat:@"%@,%@", string1, string2 ];

//方法2.
string = [string1 stringByAppendingString:string2];

//方法3 .
string = [string stringByAppendingFormat:@"%@,%@",string1, string2];

面試題4

1.現(xiàn)在有一個(gè)數(shù)組, 數(shù)組里面是整數(shù), 用你認(rèn)為最優(yōu)的算法找出里面第 k 大的元素.

2.一個(gè)理發(fā)店有一個(gè)入口和一個(gè)出口. 理發(fā)店內(nèi)有一個(gè)5人沙發(fā), 1個(gè)理發(fā)師. 新來(lái)的顧客坐在沙發(fā)上等待. 理發(fā)師可從事理發(fā)和休息兩種活動(dòng). 理發(fā)店的活動(dòng)滿(mǎn)足下列條件:

    1. 休息的理發(fā)師是坐在自己專(zhuān)用的理發(fā)椅上, 不會(huì)占用顧客的沙發(fā);
    1. 處理休息狀態(tài)的理發(fā)師可為在沙發(fā)上等待時(shí)間最長(zhǎng)的顧客理發(fā);
    1. 理發(fā)時(shí)間長(zhǎng)短由理發(fā)師決定;

適用信號(hào)量機(jī)制或管程機(jī)制實(shí)現(xiàn)理發(fā)師進(jìn)程和顧客進(jìn)程, 可以用語(yǔ)言表述.

3.如果現(xiàn)在需要讓 UILabel 進(jìn)行交互(可以點(diǎn)擊響應(yīng)事件), 有哪些方式?

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, self.view.frame.size.width - 60, self.view.frame.size.height)];
    
    label.userInteractionEnabled= YES;
    UITapGestureRecognizer *labelTapGestureRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(labelTouchUpInside:)];

    [label addGestureRecognizer:labelTapGestureRecognizer];
} 

-(void) labelTouchUpInside:(UITapGestureRecognizer *)recognizer{
    NSLog(@"被點(diǎn)擊了");
}

UILabel 也是一個(gè)UIView,同樣繼承自UIResponder殃恒,所以只要擴(kuò)展UILabel植旧,并覆蓋相關(guān)方法就可以了,如:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
// 點(diǎn)擊該label的時(shí)候, 來(lái)個(gè)高亮顯示
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self setTextColor:[UIColor whiteColor]];
}

// 還原label顏色,獲取手指離開(kāi)屏幕時(shí)的坐標(biāo)點(diǎn), 在label范圍內(nèi)的話(huà)就可以觸發(fā)自定義的操作
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [self setTextColor:COLOR(59,136,195,1.0)];
    UITouch *touch = [touches anyObject];
    CGPoint points = [touch locationInView:self];
    if (points.x >= self.frame.origin.x && points.y >= self.frame.origin.x && points.x <= self.frame.size.width && points.y <= self.frame.size.height)
    {
        [delegate myLabel:self touchesWtihTag:self.tag];
    }
}

4.UILabel 是否可以顯示 html 文本? 如果可以怎么顯示?

NSString * htmlString = @"<html><body> Some html string \n <font size=\"13\" color=\"red\">This is some text!</font> </body></html>";

NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];

UILabel * myLabel = [[UILabel alloc] initWithFrame:self.view.bounds];

myLabel.attributedText = attrStr;

[self.view addSubview:myLabel];

5.你在工作中最經(jīng)常使用什么來(lái)進(jìn)行布局和屏幕適配? 簡(jiǎn)單描述一下你遇到的問(wèn)題?
masonry(本質(zhì)上是界面約束的語(yǔ)法糖), xib

6.簡(jiǎn)單描述 UITableView 的重用機(jī)制
鏈接
7.ViewControllerloadView, viewDidLoad, viewDidUnload 分別是什么時(shí)候調(diào)用的, 在使用 ViewController 時(shí)在這幾個(gè)函數(shù)中應(yīng)該做什么工作?
鏈接


面試題5

1.聲明 @propertyNSString 屬性用 copystrong 修飾的區(qū)別?
同面試題1
2.請(qǐng)說(shuō)明一下參數(shù)區(qū)別: assign, weak, unsafe_unretain, __block__weak
同面試題1
3.@synthesize@dynamic 分別有什么作用?
同面試題1
4.在 ARC 的項(xiàng)目中, 會(huì)出現(xiàn)內(nèi)存泄露問(wèn)題嗎? 請(qǐng)舉例說(shuō)明.
鏈接
5.描述一個(gè) Block 里循環(huán)引用的實(shí)例.

鏈接
對(duì)象有一個(gè)Block屬性离唐,然而這個(gè)Block屬性中又引用了對(duì)象的其他成員變量病附,那么就會(huì)對(duì)這個(gè)變量本身產(chǎn)生強(qiáng)應(yīng)用,那么變量本身和他自己的Block屬性就形成了循環(huán)引用

6.NSNotificationKVO 區(qū)別, 各舉例一個(gè)應(yīng)用場(chǎng)景.
面試題2

7.loadView 是干嘛用的?
面試題4

8.描述 viewWillLayouSubView 的執(zhí)行過(guò)程

9.setNeedsLayout, layoutNeeded, setNeedsDisplay, 它們的作用是什么?

  • setNeedsDisplay調(diào)用drawRect方法來(lái)實(shí)現(xiàn)view的繪制
  • setNeedsLayout則調(diào)用layoutSubView來(lái)實(shí)現(xiàn)view中subView的重新布局

10.如何高性能的給 UIImageView 加個(gè)圓角? (不推薦layer.cornerRadius!)
方法一:最簡(jiǎn)單的方法, 但是會(huì)嚴(yán)重?fù)p耗性能

self.imageView=[[UIImageView alloc] initWithFrame:CGRectMake(100,200, 100, 100)];
    [self.imageView setImage:[UIImage imageNamed:@"918BB156-1FBA-47B7-89D6-4F53518BBEED.jpg"]];
    self.imageView.layer.cornerRadius = 50;
    self.imageView.layer.masksToBounds = YES;
    [self.view addSubview:self.imageView];

方法二:設(shè)置 Rasterize柵格化處理, 會(huì)將圖片放在緩存區(qū)亥鬓,不會(huì)不斷的進(jìn)行圖片渲染

    self.imageView =  [[UIImageView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
    [self.view addSubview:self.imageView];
    [self.imageView setImage:[UIImage imageNamed:@"918BB156-1FBA-47B7-89D6-4F53518BBEED.jpg"]];
    self.imageView.layer.cornerRadius = 100;
    self.imageView.layer.shouldRasterize = YES;
    self.imageView.clipsToBounds = YES;
    //不設(shè)置會(huì)模糊完沪,不相信可以自己嘗試
    self.imageView.layer.rasterizationScale = [UIScreen mainScreen].scale;

方法三:貝塞爾曲線(xiàn)

    self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
    
    UIImage *image = [UIImage imageNamed:@"918BB156-1FBA-47B7-89D6-4F53518BBEED.jpg"];
    
    // 設(shè)置繪制環(huán)境
    UIGraphicsBeginImageContextWithOptions(self.imageView.bounds.size, NO, 1);
    
    // 在繪制之前先剪出一個(gè)圓形
    [[UIBezierPath bezierPathWithRoundedRect:self.imageView.bounds cornerRadius:100] addClip];
    
    // 圖片在設(shè)置的圓形里面繪制
    [image drawInRect:self.imageView.bounds];
    
    // 獲取照片
    self.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
    
    // 結(jié)束繪制
    UIGraphicsEndImageContext();
    
    [self.view addSubview:self.imageView];

11.BAD_ACCESS 在什么情況下出現(xiàn)? 如何調(diào)試?

如何調(diào)試BAD_ACCESS錯(cuò)誤

12.什么叫做符號(hào)化(Symbolication)?
鏈接

13.什么是運(yùn)行時(shí)(Runtime)? Method Swizzling 呢?
Runtime:Objective-C的動(dòng)態(tài)特性
Method Swizzling:方法交換

14.什么是 Runloop ? Runloop 和線(xiàn)程有什么關(guān)系?
深入理解RunLoop
15.MD5Base64 的區(qū)別, 各自場(chǎng)景是什么?

參考答案:
做過(guò)加密相關(guān)的功能的,幾乎都會(huì)使用到MD5和Base64嵌戈,它們兩者在實(shí)際開(kāi)發(fā)中是最常用的覆积。

MD5:是一種不可逆的摘要算法,用于生成摘要熟呛,無(wú)法逆著破解得到原文宽档。常用的是生成32位摘要,用于驗(yàn)證數(shù)據(jù)的有效性庵朝。比如吗冤,在網(wǎng)絡(luò)請(qǐng)求接口中又厉,通過(guò)將所有的參數(shù)生成摘要,客戶(hù)端和服務(wù)端采用同樣的規(guī)則生成摘要欣孤,這樣可以防篡改。又如昔逗,下載文件時(shí)降传,通過(guò)生成文件的摘要,用于驗(yàn)證文件是否損壞勾怒。

Base64:屬于加密算法婆排,是可逆的,經(jīng)過(guò)encode后笔链,可以decode得到原文段只。在開(kāi)發(fā)中,有的公司上傳圖片采用的是將圖片轉(zhuǎn)換成base64字符串鉴扫,再上傳赞枕。在做加密相關(guān)的功能時(shí),通常會(huì)將數(shù)據(jù)進(jìn)行base64加密/解密坪创。

  1. 寫(xiě)出以下代碼的輸出結(jié)果
dispatch_queue_t queue = dispatch_queue_create("my.label", DISPATCH_QUEUE_SERIAL);
    
    NSLog(@"1");
    
    dispatch_async(queue, ^{
        
        NSLog(@"2");
        
        dispatch_sync(queue, ^{
            
            NSLog(@"3");
            
        });
        
        NSLog(@"4");
        
    });
    
    NSLog(@"5");

輸出結(jié)果:

1
5
2

17.根據(jù)你之前做過(guò)的項(xiàng)目, 描述一個(gè)緩存模型或者框架(例如圖片內(nèi)存緩存器)

--

面試題6

  1. 用偽代碼實(shí)現(xiàn)遞歸的快速排序算法.
  2. 簡(jiǎn)述一下 UITableView 的框架和使用方法.
    比較詳細(xì)的介紹了UITableView
  3. 簡(jiǎn)述 ASIHTTPRequest 的使用方法
    該作者已經(jīng)停止更新 沒(méi)使用過(guò)
    鏈接
  4. 簡(jiǎn)述 iOS 的單元測(cè)試方法.
    鏈接
  5. abcde 入棧, 不可能的出棧順序.
    不可能的出棧順序: 1.ECDBA 2.DCEAB
    1.在E先出棧的情況下(說(shuō)明此時(shí)abcde均已入棧),不可能出現(xiàn)C在D之前出棧
    2.AB均入棧的情況下, A不可能在B之前出棧
  6. int find(int *a, int n, int count)count 為 a 數(shù)組長(zhǎng)度; n 為要查找的數(shù), 假設(shè) a 為有序的數(shù)組.
  7. 為什么很多內(nèi)置的類(lèi), 如 Table ViewControllerdelegate 的屬性是 assign 不是 retain ?
    防止在ARC情況下出現(xiàn)循環(huán)引用
  8. 由于 UDID 這些無(wú)法被調(diào)用了, 有什么方法可以確定 iOS 設(shè)備的唯一性
    鏈接
  9. 列舉一下自己遇到過(guò)的 iOS App 審核被拒的解決經(jīng)歷

面試題7

1.簡(jiǎn)述OC中內(nèi)存管理機(jī)制炕婶。與 retain 配對(duì)使用的方法是 dealloc 還是 release ,為什么莱预?需要與 alloc 配對(duì)使用的方法是 dealloc 還是 release 柠掂,為什么? readwrite 依沮, readonly 涯贞, assignretain 危喉, copy 宋渔, nonatomicatomic 辜限、 strong 傻谁、 weak 屬性的作用?
面試題1
2.類(lèi)變量的 @protected , @private , @public , @package 列粪,聲明各有什么含義审磁?

  • @private 實(shí)例變量只能被聲明它的類(lèi)訪(fǎng)問(wèn)
  • @protected 實(shí)例變量能被聲明它的類(lèi)和子類(lèi)訪(fǎng)問(wèn), 如果沒(méi)有自定義關(guān)鍵字, 是默認(rèn)的選項(xiàng)
  • @public 實(shí)例變量可以被在任何地方訪(fǎng)問(wèn)
  • @package Objective-C中的@package與C語(yǔ)言中變量和函數(shù)的private_extern類(lèi)似。任何在實(shí)現(xiàn)類(lèi)的鏡像之外的代碼想使用這個(gè)實(shí)例變量都會(huì)引發(fā)link error(作用域:只能在聲明的文件中使用)

3.線(xiàn)程是什么岂座?進(jìn)程是什么态蒂?二者有什么區(qū)別和聯(lián)系?
進(jìn)程與線(xiàn)程的一個(gè)簡(jiǎn)單解釋
進(jìn)程和線(xiàn)程的區(qū)別费什?

4.談?wù)勀銓?duì)多線(xiàn)程開(kāi)發(fā)的理解钾恢?iOS中有幾種實(shí)現(xiàn)多線(xiàn)程的方法手素?
關(guān)于iOS多線(xiàn)程,你看我就夠了

5.線(xiàn)程同步和異步的區(qū)別瘩蚪?IOS中如何實(shí)現(xiàn)多線(xiàn)程的同步泉懦?
關(guān)于iOS多線(xiàn)程,你看我就夠了

6.假設(shè)有一個(gè)字符串aabcad疹瘦,請(qǐng)寫(xiě)一段程序崩哩,去掉字符串中不相鄰的重復(fù)字符串,即上述字符串處理之后的輸出結(jié)果為:aabcd

NSMutableString *str = @"aabcad".mutableCopy;
    NSMutableArray *marry = [[NSMutableArray alloc]init];
    for (int i = 0; i < str.length - 1; i++) {
        unsigned char a = [str characterAtIndex:i];
        for (int j = i + 1; j < str.length; j++) {
            unsigned char b = [str characterAtIndex:j];
            if (a == b) {
                if (j == i + 1) {
                    
                } else {
                    [marry addObject:[NSString stringWithFormat:@"%d",j]];
                }
            }
        }
    }
    for (int i = (int)marry.count - 1; i > 0; i--) {
        
        NSInteger num = [[marry objectAtIndex:i]intValue];
        
        [str deleteCharactersInRange:NSMakeRange(num, 1)];
    }
    
    NSLog(@"%@", str);

7.獲取一臺(tái)設(shè)備唯一標(biāo)識(shí)的方法有哪些言沐?
鏈接

8.iOS類(lèi)是否可以多繼承邓嘹?如果沒(méi)有,那可以用其他方法實(shí)現(xiàn)嗎险胰?簡(jiǎn)述實(shí)現(xiàn)過(guò)程汹押。
沒(méi)有 用 類(lèi)目延展 可以實(shí)現(xiàn)

9.堆和棧的區(qū)別?
棧區(qū)(stack):由編譯器自動(dòng)分配釋放起便,存放函數(shù)的參數(shù)值棚贾、局部變量的值。先進(jìn)后出
堆區(qū)(heap):一般由程序員分配釋放榆综。先進(jìn)先出
全局區(qū)(靜態(tài)區(qū))(static):全局變量和靜態(tài)變量鸟悴。程序結(jié)束后由系統(tǒng)釋放。
常量區(qū):常量字符串存放在這里奖年。程序結(jié)束后由系統(tǒng)釋放细诸。
代碼區(qū):存放函數(shù)體的二進(jìn)制文件。

10.iOS本地?cái)?shù)據(jù)存儲(chǔ)都有哪幾種方式陋守?

  • 1.plist文件存儲(chǔ)
  • 2.NSUserDefaults
  • 3.NSKeyedArchiver:(歸檔)采用歸檔的形式來(lái)保存數(shù)據(jù)震贵,該數(shù)據(jù)對(duì)象需要遵守NSCoding協(xié)議,并且該對(duì)象對(duì)應(yīng)的類(lèi)必須提供encodeWithCoder:和initWithCoder:方法水评。
  • 4.Write寫(xiě)入方式:永久保存在磁盤(pán)中猩系。但是只支持NSString、 NSData中燥、NSArray寇甸、NSDictionary
  • 5.SQLite(FMDB):注意FMDB不是數(shù)據(jù)庫(kù), 而是一個(gè)SQLite管理框架.
  • 6.CoreData:切記CoreData不是數(shù)據(jù)庫(kù), 他的存儲(chǔ)核心思想是托管對(duì)象, 只是咱們經(jīng)常用的存儲(chǔ)文件為SQLite.還可以用XML, 二進(jìn)制等方式. CoreData入門(mén)

11.iOS動(dòng)態(tài)類(lèi)型和動(dòng)態(tài)綁定、動(dòng)態(tài)載入

  • 1.動(dòng)態(tài)類(lèi)型:如id類(lèi)型疗涉。實(shí)際上靜態(tài)類(lèi)型因?yàn)槠涔潭ㄐ院涂深A(yù)知性而使用得更加廣泛拿霉。靜態(tài)類(lèi)型是強(qiáng)類(lèi)型,而動(dòng)態(tài)類(lèi)型屬于弱類(lèi)型咱扣。運(yùn)行時(shí)決定接收者绽淘。
  • 2.動(dòng)態(tài)綁定:讓代碼在運(yùn)行時(shí)判斷需要調(diào)用什么方法,而不是在編譯時(shí)闹伪。與其他面向?qū)ο笳Z(yǔ)言一樣沪铭,方法調(diào)用和代碼并沒(méi)有在編譯時(shí)連接在一起壮池,而是在消息發(fā)送時(shí)才進(jìn)行連接。運(yùn)行時(shí)決定調(diào)用哪個(gè)方法杀怠。
  • 3.動(dòng)態(tài)載入:讓程序在運(yùn)行時(shí)添加代碼模塊以及其他資源, 用戶(hù)可以根據(jù)需要加載一些可執(zhí)行代碼和資源椰憋,而不是在啟動(dòng)時(shí)就加載所有組件∨馔耍可執(zhí)行代碼中可以含有和程序運(yùn)行時(shí)整合的新類(lèi)橙依。

Objective-C多態(tài):動(dòng)態(tài)類(lèi)型識(shí)別+動(dòng)態(tài)綁定+動(dòng)態(tài)加載


面試題8

1.寫(xiě)出方法獲取iOS內(nèi)存使用情況。

// 獲取當(dāng)前設(shè)備可用內(nèi)存及所占內(nèi)存的頭文件
#import <sys/sysctl.h>
#import <mach/mach.h>
// 獲取當(dāng)前設(shè)備可用內(nèi)存(單位:MB)
- (double)availableMemory
{
  vm_statistics_data_t vmStats;
  mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;
  kern_return_t kernReturn = host_statistics(mach_host_self(), 
                                             HOST_VM_INFO, 
                                             (host_info_t)&vmStats, 
                                             &infoCount);
  
  if (kernReturn != KERN_SUCCESS) {
  return NSNotFound;
  }
  return ((vm_page_size *vmStats.free_count) / 1024.0) / 1024.0;
}
// 獲取當(dāng)前任務(wù)所占用的內(nèi)存(單位:MB)
- (double)usedMemory
{
  task_basic_info_data_t taskInfo;
  mach_msg_type_number_t infoCount = TASK_BASIC_INFO_COUNT;
  kern_return_t kernReturn = task_info(mach_task_self(), 
                                       TASK_BASIC_INFO, 
                                       (task_info_t)&taskInfo, 
                                       &infoCount);

  if (kernReturn != KERN_SUCCESS) {
  return NSNotFound;
  }
  return taskInfo.resident_size / 1024.0 / 1024.0;}

2.深拷貝和淺拷貝的理解离钝?
見(jiàn)上面題

3.怎樣實(shí)現(xiàn)一個(gè)singleton的類(lèi)票编。

+ (Singleton *) sharedInstance {
    static Singleton *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[Singleton alloc] init];
    });
    
    return sharedInstance;
}

鏈接

4.什么是安全釋放褪储?
把對(duì)象指著置為nil,再對(duì)其釋放

5.RunLoop是什么卵渴?
一個(gè)RunLoop就是一個(gè)事件處理的循環(huán),用來(lái)不停的調(diào)度工作以及處理輸入時(shí)間鲤竹。使用runloop的目的是讓你的線(xiàn)程在有工作的時(shí)候忙于工作,而沒(méi)工作的時(shí)候處于休眠狀態(tài)浪读。runloop的設(shè)計(jì)是為了減少cpu無(wú)謂的空轉(zhuǎn)。每個(gè)開(kāi)辟的線(xiàn)程都有一個(gè)Runloop, 主線(xiàn)程的Runloop時(shí)默認(rèn)開(kāi)啟的, 咱們手動(dòng)開(kāi)辟的子線(xiàn)程Runloop是默認(rèn)不開(kāi)啟的, 如果需要開(kāi)啟, 需要調(diào)用

API[[NSRunloop   currentRunloop] run]

開(kāi)啟.最常見(jiàn)的需要開(kāi)啟Runloop的是在子線(xiàn)程里面調(diào)用計(jì)時(shí)器(NSTimer), 如果不開(kāi)啟 runloop循環(huán)方法就不能正常執(zhí)行.

深入理解RunLoop

6.什么是序列化和反序列化辛藻,可以用來(lái)做什么碘橘?如何在OC中實(shí)現(xiàn)復(fù)雜對(duì)象的存儲(chǔ)?

如果你需要存儲(chǔ)一個(gè)復(fù)雜的對(duì)象的話(huà)吱肌,經(jīng)常要以二進(jìn)制的方法序列化這個(gè)對(duì)象痘拆,這個(gè)過(guò)程叫Archiving。如果一個(gè)對(duì)象需要進(jìn)行序列化氮墨,那么需要遵循NScoding協(xié)議纺蛆,主要有兩個(gè)方法: -(id)initWithCoder:(NSCoder)coder;//從coder中讀取數(shù)據(jù),保存到相應(yīng)變量中规揪,即反序列化數(shù)據(jù)桥氏。 -(void)encodeWithCoder:(NSCoder)coder;//讀取實(shí)例變量,并把這些數(shù)據(jù)寫(xiě)到coder中去猛铅,即序列化數(shù)據(jù)字支。
主要用于存儲(chǔ)對(duì)象狀態(tài)為另一種通用格式,比如存儲(chǔ)為二進(jìn)制奸忽、xml堕伪、json等等

7.寫(xiě)一個(gè)標(biāo)準(zhǔn)宏MIN,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)栗菜?

#define MIN_NUMBER(a, b) ((a)<(b))?(a):(b)

運(yùn)算符優(yōu)先級(jí)(不加括號(hào)可能會(huì)出現(xiàn)歧義)

8.iphone os有沒(méi)有垃圾回收機(jī)制刃跛?簡(jiǎn)單闡述一下OC內(nèi)存管理。
iphone os沒(méi)有垃圾回收機(jī)制苛萎。
垃圾回收機(jī)制用于在空閑時(shí)間以不定時(shí)的方式動(dòng)態(tài)的回收無(wú)任何引用的對(duì)象占據(jù)的內(nèi)存空間

OC內(nèi)存管理:
OC的內(nèi)存管理機(jī)制是引用計(jì)數(shù), 內(nèi)存管理原則是誰(shuí)開(kāi)辟誰(shuí)釋放, 有retain就要有release.
.分為ARC(自動(dòng)引用計(jì)數(shù))和MRC(非自動(dòng)引用計(jì)數(shù)), 在MRC下, 我們需要手動(dòng)管理內(nèi)存,需要使用到 retain/copy/release/autorelease等方法實(shí)現(xiàn)內(nèi)存管理, ARC下一般不需要程序員手動(dòng)管理內(nèi)存, 系統(tǒng)會(huì)為程序添加自動(dòng)釋放池以實(shí)現(xiàn)內(nèi)存管理, 當(dāng)然, 咱們說(shuō)的一般不需要不能理解為完全不需要考慮內(nèi)存問(wèn)題, 比如在解決block循環(huán)引用問(wèn)題的時(shí)候, 就需要使用__weak修飾, 需要注意的是ARC和MRC下解決循環(huán)引用的方法還不一樣,MRC下是__block, ARC下是__weak .

9.簡(jiǎn)述應(yīng)用程序按Home鍵進(jìn)入后臺(tái)時(shí)的生命周期桨昙,以及從后臺(tái)回到前臺(tái)時(shí)的生命周期检号?
進(jìn)入后臺(tái)的生命周期:

- (void)applicationWillResignActive:(UIApplication *)application {   
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
}

回到前臺(tái)的生命周期

- (void)applicationWillEnterForeground:(UIApplication *)application {
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
}

10.ViewControllerallocloadView, viewDidLoad,viewWillAppear, viewDidUnload, dealloc蛙酪、init分別是在什么時(shí)候調(diào)用的齐苛?在自定義ViewController的時(shí)候這幾個(gè)函數(shù)里面應(yīng)該做什么工作?

alloc初始化當(dāng)前的ViewController
loadView:沒(méi)有正在使用nib視圖頁(yè)面桂塞,子類(lèi)將會(huì)創(chuàng)建自己的自定義視圖層
viewDidLoad:試圖被加載后調(diào)用
viewWillAppear:試圖即將出現(xiàn)的時(shí)候調(diào)用
viewDidUnload:<iOS6之后廢棄>當(dāng)系統(tǒng)內(nèi)存吃緊的時(shí)候會(huì)調(diào)用該方法,釋放掉當(dāng)前未在window中顯示的試圖和對(duì)應(yīng)的控制器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凹蜂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子阁危,更是在濱河造成了極大的恐慌玛痊,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狂打,死亡現(xiàn)場(chǎng)離奇詭異擂煞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)趴乡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)对省,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人晾捏,你說(shuō)我怎么就攤上這事蒿涎。” “怎么了惦辛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵劳秋,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我胖齐,道長(zhǎng)玻淑,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任市怎,我火速辦了婚禮岁忘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘区匠。我一直安慰自己干像,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布驰弄。 她就那樣靜靜地躺著麻汰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪戚篙。 梳的紋絲不亂的頭發(fā)上五鲫,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音岔擂,去河邊找鬼位喂。 笑死浪耘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的塑崖。 我是一名探鬼主播七冲,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼规婆!你這毒婦竟也來(lái)了澜躺?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤抒蚜,失蹤者是張志新(化名)和其女友劉穎掘鄙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體嗡髓,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡操漠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了器贩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颅夺。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡朋截,死狀恐怖蛹稍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情部服,我是刑警寧澤唆姐,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站廓八,受9級(jí)特大地震影響奉芦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剧蹂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一声功、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宠叼,春花似錦先巴、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至简烤,卻和暖如春剂邮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背横侦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工挥萌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绰姻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓引瀑,卻偏偏與公主長(zhǎng)得像龙宏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子伤疙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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