(iOS面試資料大全)
1、簡述你項(xiàng)目中常用的設(shè)計(jì)模式度液。它們有什么優(yōu)缺點(diǎn)?
常用的設(shè)計(jì)模式有:代理、觀察者镜粤、單例幢踏。
(1)單例:它是用來限制一個(gè)類只能創(chuàng)建一個(gè)對(duì)象髓需。這個(gè)對(duì)象中的屬性可以存儲(chǔ)全局共享的數(shù)據(jù)。所有的類都能訪問房蝉、設(shè)置此單例中的屬性數(shù)據(jù)僚匆。
優(yōu)點(diǎn):是它只會(huì)創(chuàng)建一個(gè)對(duì)象容易供外界訪問,節(jié)約性能搭幻。
缺點(diǎn):是一個(gè)類只有一個(gè)對(duì)象咧擂,可能造成責(zé)任過重,在一定程度上違背了“單一職責(zé)原則”檀蹋。單例模式中沒有抽象層松申,所以單例類的擴(kuò)展有很大的困難。不能過多創(chuàng)建單例俯逾,因?yàn)閱卫龔膭?chuàng)建到程序關(guān)閉前會(huì)一直存在攻臀,過多的單例會(huì)影響性能,浪費(fèi)系統(tǒng)資源纱昧。
(2)觀察者(KVO):它提供了觀察某一屬性變化的方法刨啸。當(dāng)指定對(duì)象的屬性發(fā)生改變后,它會(huì)自動(dòng)通知相應(yīng)的觀察者识脆。
優(yōu)點(diǎn):能提供被觀察者屬性的新值與舊值设联。用keypaths來觀察屬性,因此也可以觀察嵌套對(duì)象灼捂。
缺點(diǎn):需要注冊(cè)觀察者离例,實(shí)現(xiàn)observeValueForKeyPath:方法,屬性可以通過KVC的方法來修改悉稠。否則觀察者收不到通知宫蛆。
(3)代理:可以實(shí)現(xiàn)類與類之間一對(duì)一的通信。
優(yōu)點(diǎn):代理協(xié)議方法都有清晰的定義的猛。代理方法可以設(shè)置可選或必須實(shí)現(xiàn)耀盗。
缺點(diǎn):需要定義協(xié)議方法,需要設(shè)置代理對(duì)象卦尊,代理對(duì)象實(shí)現(xiàn)協(xié)議方法叛拷。內(nèi)存管理方面,需要注意循環(huán)引用問題岂却。
2忿薇、代理模式能否實(shí)現(xiàn)一對(duì)多的通信裙椭?
可以,采用多播委托的方式來實(shí)現(xiàn)署浩。多播委托:它是指允許創(chuàng)建方法的調(diào)用列表或者鏈表的能力揉燃。當(dāng)多播委托被調(diào)用時(shí),列表中的方法均自動(dòng)執(zhí)行筋栋。
普通代理只能是一對(duì)一的回調(diào)炊汤,無法做到一對(duì)多的回調(diào),而多播委托正式對(duì)delegate的一種擴(kuò)展與延伸二汛,多了一個(gè)注冊(cè)和取消的過程婿崭。任何需要回調(diào)的對(duì)象都必須先注冊(cè)拨拓。
3肴颊、 重復(fù)注冊(cè)通知會(huì)有問題嗎?
不會(huì)出現(xiàn)問題渣磷,若多次發(fā)送同一通知婿着,對(duì)方就會(huì)多次響應(yīng)。如果重復(fù)注冊(cè)通知醋界,也會(huì)有多次響應(yīng)的效果竟宋。為了避免重復(fù)注冊(cè)通知而造成的錯(cuò)誤,建議每次注冊(cè)一個(gè)通知前形纺,可以移除一次該通知丘侠。
4、項(xiàng)目中是否用過多線程編程逐样?簡述你常用的多線程實(shí)現(xiàn)方式蜗字?
常用的是GCD。
GCD是蘋果開發(fā)中一個(gè)多核編程的解決方案脂新。GCD的隊(duì)列分為兩種類型挪捕,SerialDispatchQueue與ConcurrentDispatchQueue。系統(tǒng)默認(rèn)提供了一個(gè)dispatch_get_main_queue争便,一個(gè)dispatch_get_global_queue级零。
5、簡述NSOperationQueue與GCD的區(qū)別滞乙。
(1) GCD是底層的C語言構(gòu)成的API奏纪。NSOperationQueue及相關(guān)對(duì)象是Objc對(duì)象。在GCD中斩启,在隊(duì)列中執(zhí)行的是由block構(gòu)成的任務(wù)亥贸,這是一個(gè)輕量級(jí)的數(shù)據(jù)結(jié)構(gòu)。而Operation作為一個(gè)對(duì)象浇垦,為我們提供了更多的選擇炕置。
(2) 在NSOperationQueue中荣挨,我們可以取消任務(wù),而GCD沒法停止已經(jīng)加入queue的block朴摊。
(3) NSOperation能夠方便的設(shè)置依賴關(guān)系默垄。還能設(shè)置NSOperation的priority優(yōu)先級(jí),能夠使同一個(gè)并行隊(duì)列中的任務(wù)區(qū)分先后地執(zhí)行甚纲。在GCD中口锭,我們只能區(qū)分不同任務(wù)隊(duì)列的優(yōu)先級(jí),如果要區(qū)分block任務(wù)優(yōu)先級(jí)也需要大量復(fù)雜代碼介杆。
NSOperation還可以設(shè)置并發(fā)數(shù)鹃操。
6、實(shí)現(xiàn)多線程有哪幾種方式春哨?
(1)NSThread:detachNewThreadSelector:
(2)繼承NSOperation
(3)GCD:dispatch_async
(4)NSObject:performSelectorInBackground:
7荆隘、KVC、KVO是什么赴背?簡述KVO的實(shí)現(xiàn)原理椰拒。KVO能否監(jiān)聽數(shù)組?如何實(shí)現(xiàn)凰荚?
KVC:鍵值編碼燃观,它是一種間接訪問對(duì)象實(shí)例變量機(jī)制,可以不通過存取方法訪問對(duì)象的實(shí)例變量便瑟。
KVO:鍵值觀察缆毁,它可以使對(duì)象獲取其他對(duì)象屬性變化的通知機(jī)制。
KVO是根據(jù)isa-swizzling技術(shù)來實(shí)現(xiàn)的到涂,主要依據(jù)runtime的強(qiáng)大動(dòng)態(tài)能力脊框。當(dāng)給某個(gè)對(duì)象第一次添加KVO監(jiān)聽的時(shí)候,運(yùn)行時(shí)會(huì)動(dòng)態(tài)的創(chuàng)建一個(gè)被監(jiān)聽對(duì)象的派生類养盗,然后重寫KVO需要監(jiān)聽屬性值對(duì)應(yīng)的setter方法缚陷,在這個(gè)setter方法中實(shí)現(xiàn)了通知機(jī)制。最后將被監(jiān)聽對(duì)象的isa指向動(dòng)態(tài)創(chuàng)建的派生類往核。這樣當(dāng)使用KVC修改屬性值時(shí)箫爷,就會(huì)調(diào)用動(dòng)態(tài)創(chuàng)建的派生類中對(duì)應(yīng)的setter方法,觸發(fā)通知機(jī)制聂儒,從而實(shí)現(xiàn)了KVO了虎锚。
KVO可以監(jiān)聽數(shù)組。
實(shí)現(xiàn) NSMutableArray 的增刪改操作遵從 KVC 的規(guī)則衩婚,需要實(shí)現(xiàn)其對(duì)應(yīng)方法:
增操作 -insertObject:inAtIndex: 或者 -insert:atIndexes:
刪操作 -removeObjectFromAtIndex: 或者 -removeAtIndexes:
改操作 -replaceObjectInAtIndex:withObject: 或者 -replaceAtIndexes:with:
并將這些接口暴露給調(diào)用者窜护,在對(duì)數(shù)組進(jìn)行操作時(shí)需使用上述實(shí)現(xiàn)的接口。
8非春、簡單說下C++柱徙,JAVA缓屠,Objective-C這幾種語言有什么區(qū)別?
Objective-C與JAVA都是單繼承語言护侮,C++是多繼承語言敌完。
Objective-C不支持命名空間機(jī)制,通過類名前面加前綴NS來區(qū)分羊初。
Objective-C與JAVA不支持運(yùn)算符重載滨溉。
Objective-C協(xié)議可選實(shí)現(xiàn),JAVA的接口必須實(shí)現(xiàn)长赞。
9晦攒、數(shù)組添加nil元素有問題嗎?字典object與key可以設(shè)置為nil嗎得哆?
會(huì)有問題脯颜,數(shù)組中添加nil元素,程序會(huì)崩潰柳恐!報(bào)object cannot be nil錯(cuò)誤伐脖。字典的key不能為nil热幔,否則會(huì)造成崩潰乐设。字典的object也不能為nil。
10绎巨、oc中向一個(gè)nil對(duì)象發(fā)送消息會(huì)出現(xiàn)問題嗎捧韵?
不會(huì)出現(xiàn)問題移稳,因?yàn)閛bjc是動(dòng)態(tài)語言,每個(gè)方法在運(yùn)行時(shí)會(huì)被動(dòng)態(tài)轉(zhuǎn)為消息發(fā)送。即:objc_msgSend(receiver染苛,selector)。objc在向一個(gè)對(duì)象發(fā)送消息時(shí)巴刻,runtime庫會(huì)根據(jù)對(duì)象的isa指針找到該對(duì)象實(shí)際所屬的類狠鸳,然后在該類中的方法列表以及其父類方法列表中尋找方法運(yùn)行,然后在發(fā)送消息的時(shí)候留瞳,objc_msgSend方法不會(huì)返回值拒迅,所謂的返回內(nèi)容都是具體調(diào)用時(shí)執(zhí)行的。 那么她倘,回到本題璧微,如果向一個(gè)nil對(duì)象發(fā)送消息,首先在尋找對(duì)象的isa指針時(shí)就是0地址返回了硬梁,所以不會(huì)出現(xiàn)任何錯(cuò)誤前硫。
11、可變數(shù)組是線程安全的嗎荧止?什么情況下不安全屹电?可以加鎖嗎阶剑?它鎖住的是添加元素操作還是數(shù)組對(duì)象?
可變數(shù)組不是線程安全的危号,在異步讀取數(shù)據(jù)的情況下是不安全的个扰。可以加鎖葱色,鎖住的是數(shù)組递宅。
12、數(shù)組能添加一個(gè)block嗎苍狰?數(shù)組添加一個(gè)block之后再取出來办龄,這個(gè)block還有用嗎?
可以淋昭,還有用俐填,它只是多retain了一次
13、NSMutableDictionary中的setObject:forKey:與setValue:forKey:方法有什么區(qū)別?
setObject:forkey:中value是不能夠?yàn)閚il的翔忽,不然會(huì)報(bào)錯(cuò)英融。
setValue:forKey:中的value能夠?yàn)閚il,但是當(dāng)value為nil的時(shí)候歇式,會(huì)自動(dòng)調(diào)用removeObject:forKey方法驶悟。
setValue:forKey:中的key的參數(shù)只能是NSString類型,而setObject:forKey是可以任何類型材失。
14痕鳍、簡述copy與mutablecopy的區(qū)別。
(1)非容器對(duì)象:
對(duì)不可變對(duì)象:copy是指針復(fù)制(淺拷貝)龙巨, mutableCopy是對(duì)象復(fù)制(深拷貝)笼呆。
對(duì)可變對(duì)象:copy和mutableCopy都是對(duì)象復(fù)制。
(2)容器對(duì)象:
對(duì)不可變對(duì)象:copy是指針復(fù)制旨别,mutableCopy是對(duì)象復(fù)制诗赌。
對(duì)可變對(duì)象:copy和mutableCopy都是對(duì)象復(fù)制,只是返回的對(duì)象類型不一樣秸弛,前者返回的是不可變對(duì)象铭若,后者返回的是可變對(duì)象。
容器對(duì)象復(fù)制僅限于對(duì)象本身胆屿,對(duì)象元素仍然是指針復(fù)制奥喻。
15、簡述weak與assign的區(qū)別非迹。
weak用來修飾對(duì)象环鲤,不能修飾基本數(shù)據(jù)類型。assign一般用來修飾基本數(shù)據(jù)類型憎兽。weak修飾對(duì)象冷离,在對(duì)象釋放之后會(huì)把對(duì)象置為nil吵冒。
16、ARC下西剥,不顯示指定任何屬性關(guān)鍵字時(shí)痹栖,默認(rèn)的關(guān)鍵字有哪些?
基本數(shù)據(jù)類型默認(rèn)修飾關(guān)鍵字:atomic,readwrite,assign
普通的OC對(duì)象默認(rèn)修飾關(guān)鍵字:atomic,readwrite,strong
17瞭空、weak在什么時(shí)候置空揪阿?
runtime 對(duì)注冊(cè)的類, 會(huì)進(jìn)行布局咆畏,對(duì)于 weak 對(duì)象會(huì)放入一個(gè) hash 表中南捂。 用 weak 指向的對(duì)象內(nèi)存地址作為 key,當(dāng)此對(duì)象的引用計(jì)數(shù)為0的時(shí)候會(huì) dealloc旧找,假如 weak 指向的對(duì)象內(nèi)存地址是a溺健,那么就會(huì)以a為鍵, 在這個(gè) weak 表中搜索钮蛛,找到所有以a為鍵的 weak 對(duì)象鞭缭,從而設(shè)置為 nil。
我們可以設(shè)計(jì)一個(gè)函數(shù)(偽代碼)來表示上述機(jī)制:
objc_storeWeak(&a, b)函數(shù):
objc_storeWeak函數(shù)把第二個(gè)參數(shù)–賦值對(duì)象(b)的內(nèi)存地址作為鍵值key魏颓,將第一個(gè)參數(shù)–weak修飾的屬性變量(a)的內(nèi)存地址(&a)作為value岭辣,注冊(cè)到 weak 表中。如果第二個(gè)參數(shù)(b)為0(nil)琼开,那么把變量(a)的內(nèi)存地址(&a)從weak表中刪除易结,
你可以把objc_storeWeak(&a, b)理解為:objc_storeWeak(value, key)枕荞,并且當(dāng)key變nil柜候,將value置nil。
在b非nil時(shí)躏精,a和b指向同一個(gè)內(nèi)存地址渣刷,在b變nil時(shí),a變nil矗烛。此時(shí)向a發(fā)送消息不會(huì)崩潰:在Objective-C中向nil發(fā)送消息是安全的辅柴。
而如果a是由assign修飾的,則: 在b非nil時(shí)瞭吃,a和b指向同一個(gè)內(nèi)存地址碌嘀,在b變nil時(shí),a還是指向該內(nèi)存地址歪架,變野指針股冗。此時(shí)向a發(fā)送消息極易崩潰。
下面我們將基于objc_storeWeak(&a, b)函數(shù)和蚪,使用偽代碼模擬“runtime如何實(shí)現(xiàn)weak屬性”:
// 使用偽代碼模擬:runtime如何實(shí)現(xiàn)weak屬性
id obj1;
objc_initWeak(&obj1, obj);
/obj引用計(jì)數(shù)變?yōu)?止状,變量作用域結(jié)束/
objc_destroyWeak(&obj1);
下面對(duì)用到的兩個(gè)方法objc_initWeak和objc_destroyWeak做下解釋:
總體說來烹棉,作用是: 通過objc_initWeak函數(shù)初始化“附有weak修飾符的變量(obj1)”,在變量作用域結(jié)束時(shí)通過objc_destoryWeak函數(shù)釋放該變量(obj1)怯疤。
下面分別介紹下方法的內(nèi)部實(shí)現(xiàn):
objc_initWeak函數(shù)的實(shí)現(xiàn)是這樣的:在將“附有weak修飾符的變量(obj1)”初始化為0(nil)后浆洗,會(huì)將“賦值對(duì)象”(obj)作為參數(shù),調(diào)用objc_storeWeak函數(shù)集峦。
obj1 = 0伏社;
obj_storeWeak(&obj1, obj);
也就是說:
weak 修飾的指針默認(rèn)值是 nil (在Objective-C中向nil發(fā)送消息是安全的)
然后obj_destroyWeak函數(shù)將0(nil)作為參數(shù),調(diào)用objc_storeWeak函數(shù)塔淤。
objc_storeWeak(&obj1, 0);
前面的源代碼與下列源代碼相同洛口。
// 使用偽代碼模擬:runtime如何實(shí)現(xiàn)weak屬性
id obj1;
obj1 = 0;
objc_storeWeak(&obj1, obj);
/* … obj的引用計(jì)數(shù)變?yōu)?,被置nil … */
objc_storeWeak(&obj1, 0);
objc_storeWeak函數(shù)把第二個(gè)參數(shù)–賦值對(duì)象(obj)的內(nèi)存地址作為鍵值凯沪,將第一個(gè)參數(shù)–weak修飾的屬性變量(obj1)的內(nèi)存地址注冊(cè)到 weak 表中第焰。如果第二個(gè)參數(shù)(obj)為0(nil),那么把變量(obj1)的地址從weak表中刪除妨马,在后面的相關(guān)一題會(huì)詳解挺举。
以上內(nèi)容總結(jié)如下:
(1)從weak表中獲取廢棄對(duì)象的地址為鍵值的記錄
(2)將包含在記錄中的所有附有__weak修飾符變量的地址,賦值為nil
(3)從weak表中刪除該記錄
(4)從引用計(jì)數(shù)表中刪除廢棄對(duì)象的地址為鍵值的記錄烘跺。
18湘纵、自動(dòng)釋放池用過嗎?它是什么時(shí)候釋放滤淳?什么情況下對(duì)象會(huì)被加入到自動(dòng)釋放池梧喷,它會(huì)加入到哪個(gè)自動(dòng)釋放池?
主線程默認(rèn)開啟runloop,同時(shí)runloop會(huì)自動(dòng)創(chuàng)建一個(gè)autoreleasepool,autorelease對(duì)象會(huì)自動(dòng)被加入autoreleasepool中脖咐,一次runloop后清空自動(dòng)釋放池铺敌。用__autoreleasing修飾符修飾,或類方法創(chuàng)建會(huì)自動(dòng)加入autoreleasepool屁擅。它會(huì)加入到最近的autoreleasepool中偿凭。
19、你知道iOS中有哪些數(shù)據(jù)持久化方式嗎派歌?請(qǐng)簡要加以說明弯囊。
iOS中數(shù)據(jù)持久化方式有:SQLite3數(shù)據(jù)庫,CoreData胶果,文件歸檔匾嘱,屬性列表(plist文件寫入)。
屬性列表:涉及的主要類是NSUserDefaults早抠,存儲(chǔ)小量的數(shù)據(jù)霎烙。
文件歸檔:對(duì)象必須實(shí)現(xiàn)NSCoding協(xié)議。實(shí)現(xiàn)initWithCoder:方法與encodeWithCoder方法。同時(shí)也建議實(shí)現(xiàn)NSCopying協(xié)議吼过。
SQLite3數(shù)據(jù)庫:SQLite是一個(gè)開源的嵌入式關(guān)系數(shù)據(jù)庫锐秦。可移植性好盗忱,容易使用酱床,需要內(nèi)存開銷小。適合嵌入式設(shè)備趟佃。
CoreData:它可以使用SQLite保存數(shù)據(jù)扇谣,而且不需要寫SQL語句。另外它還可以使用XML方式保存數(shù)據(jù)闲昭。要使用CoreData罐寨,需要在Xcode中的數(shù)據(jù)模型編輯器中設(shè)計(jì)好各個(gè)實(shí)體以及定義好他們的屬性和關(guān)系。通過操作這些對(duì)象來完成數(shù)據(jù)的持久化序矩。
20鸯绿、fmdb中支持多線程嗎?它是如何實(shí)現(xiàn)的簸淀!
支持多線程瓶蝴。它里面有個(gè)FMDatabaseQueue類。它看似是一個(gè)隊(duì)列租幕,實(shí)際上它本身并不是舷手,它繼承NSObject,通過內(nèi)部創(chuàng)建一個(gè)Serial的dipatch_queue_t來處理inDatabase和inTransaction傳入的Block劲绪,所以當(dāng)我們?cè)谥骶€程(或者后臺(tái))調(diào)用inDatabase或者inTransaction時(shí)男窟,代碼實(shí)際上是同步的。FMDatabaseQueue如此設(shè)計(jì)的目的是為了避免并發(fā)訪問數(shù)據(jù)庫的線程安全問題贾富,所有的數(shù)據(jù)庫訪問都是同步執(zhí)行歉眷,比@synchronized與NSLock效率高。
21祷安、簡述category與extension的區(qū)別姥芥。Category與extension加載的時(shí)機(jī)。
category中只能增加方法汇鞭,不可添加實(shí)例變量(可添加屬性)。extension不僅可以增加方法庸追,還可以增加實(shí)例變量或?qū)傩裕ㄋ接械模┗艚尽xtension不能像category一樣有獨(dú)立的實(shí)現(xiàn)部分。category是運(yùn)行時(shí)決定的淡溯。extension是編譯期決定的读整。
22、category的方法能被子類繼承嗎咱娶?它覆蓋原有類的方法后米间,原有類的方法還能調(diào)用嗎强品?如果能,你說明理由屈糊。
category的方法可以被子類繼承的榛。category并不是絕對(duì)的覆蓋了類的同名方法,而是category的方法排在了類的同名方法之前逻锐,方法的檢索方式是順序檢索夫晌,所以在調(diào)用方法時(shí),調(diào)用到的同名方法是category昧诱,從而產(chǎn)生了覆蓋晓淀。
利用運(yùn)行時(shí)遍歷方法列表,可以調(diào)用被category覆蓋的方法盏档。
23凶掰、 擴(kuò)展一個(gè)類的方式用繼承好還是category好?請(qǐng)說明理由蜈亩。
用類目好锄俄。因?yàn)槔^承還需要定義子類。類目不需要通過創(chuàng)建子類來增加現(xiàn)有類的方法勺拣。用category去重寫一個(gè)類的方法奶赠,僅僅只對(duì)本category有效,不會(huì)影響到其他類與原有類的關(guān)系药有。
24毅戈、 block有幾種類型?block的實(shí)現(xiàn)愤惰?
block分為三種類型:
_NSConcreteGlobalBlock
_NSConcreteStackBlock
_NSConcreteMallocBlock
block:匿名函數(shù)
25苇经、 Swift用的多嗎?簡單的說說1.0與2.0的區(qū)別宦言。
swift2.0新增:guard語句扇单,異常處理,協(xié)議擴(kuò)展奠旺,打印語句改變蜘澜,avaliable檢查,do-while語句重命名:repeat-while响疚,defer關(guān)鍵字
26鄙信、 在Swift用有沒有用過defer關(guān)鍵字?
對(duì)defer語句進(jìn)行的延遲忿晕,函數(shù)結(jié)束時(shí)調(diào)用装诡。
27、 SDWebImage的圖片保存在什么位置?
圖片保存在沙盒中的library/caches文件夾下鸦采。
28宾巍、 Objective-C中類目為什么不能添加實(shí)例變量?
因?yàn)樵谶\(yùn)行時(shí)渔伯,對(duì)象的內(nèi)存布局已經(jīng)確定顶霞,如果添加實(shí)例變量會(huì)破壞類的內(nèi)部布局。
29咱旱、 Objective-C中的協(xié)議默認(rèn)是@optional還是@require确丢?在使用協(xié)議的時(shí)候應(yīng)當(dāng)注意哪些問題?
Objective-C中的協(xié)議默是必須實(shí)現(xiàn)的@require吐限,使用協(xié)議的時(shí)候應(yīng)當(dāng)注意循環(huán)引用問題鲜侥,多個(gè)協(xié)議之間采用逗號(hào)分隔。
30诸典、 Objective-C的協(xié)議與JAVA中的接口有什么區(qū)別描函?
OC中的協(xié)議可選實(shí)現(xiàn),JAVA中的接口必須實(shí)現(xiàn)狐粱。
31舀寓、 類目的應(yīng)用場景有哪些?
(1)可以把類的實(shí)現(xiàn)分開在幾個(gè)不同的文件里面
(2)聲明私有方法
(3)模擬多繼承
(4)把Framework的私有方法公開
32肌蜻、 self與super的區(qū)別互墓?
super本質(zhì)上是一個(gè)編譯器標(biāo)示符,它和self指向的是同一個(gè)消息接受者蒋搜,兩者不同在于:super會(huì)告訴編譯器篡撵,調(diào)用class這個(gè)方法時(shí),要去父類方法豆挽,而不是本類方法育谬。
33、 圖片緩存為什么不保存到沙盒下的tmp文件目錄中帮哈?
因?yàn)閠mp文件夾是用來存放臨時(shí)文件膛檀,iTunes不會(huì)備份和恢復(fù)此目錄,此目錄下文件可能會(huì)在應(yīng)用退出后刪除娘侍。
34咖刃、 NSURLConnection與NSURLSession。
NSURLConnection它是CoreFoundation/CFNetwork框架的API之上的一個(gè)抽象私蕾。
NSURLConnection這個(gè)名字實(shí)際指代Foundation框架的URL加載系統(tǒng)中一系列有關(guān)聯(lián)的組件:NSURLRequest僵缺、NSURLResponse、NSURLProtocol踩叭、NSURLCache、NSHTTPCookieStorage、NSURLCredentialStorage以及同名類NSURLConnection容贝。NSURLRequest 被傳遞給 NSURLConnection自脯。被委托對(duì)象(遵守以前的非正式協(xié)議 和 )異步地返回一個(gè) NSURLResponse 以及包含服務(wù)器返回信息的 NSData。
NSURLSession包括:NSURLRequest斤富、NSURLCache膏潮、NSURLSession、NSURLSessionConfiguration满力、NSURLSessionDataTask焕参、NSURLSessionUploadTask、NSURLSessionDownloadTask油额。
它與NSURLConnection的區(qū)別在于:NSURLSession最直接的改進(jìn)就是可以配置每個(gè)Session的緩存叠纷,協(xié)議,cookie以及正式策略潦嘶。甚至跨程序共享這些信息涩嚣。每個(gè)NSURLSession對(duì)象都由一個(gè)NSURLSessionConfiguration對(duì)象來進(jìn)行初始化。
session task:負(fù)責(zé)處理數(shù)據(jù)的加載以及文件和數(shù)據(jù)在客戶端與服務(wù)器之間的上次和下載掂僵。
35航厚、 簡述ARC與MRC的區(qū)別。
ARC:自動(dòng)引用計(jì)數(shù)锰蓬。MRC:手動(dòng)引用計(jì)數(shù)幔睬。ARC是把內(nèi)存交給系統(tǒng)管理。系統(tǒng)會(huì)在編譯的時(shí)候自動(dòng)插入retain/release芹扭。MRC則需要手動(dòng)管理對(duì)象的引用計(jì)數(shù)麻顶。當(dāng)你alloc,new,copy,mutablecopy或者retain一個(gè)對(duì)象時(shí),你就有義務(wù)向它發(fā)送一條release或autorelease消息冯勉。