(iOS面試資料大全)
1、簡(jiǎn)述你項(xiàng)目中常用的設(shè)計(jì)模式。它們有什么優(yōu)缺點(diǎn)?
常用的設(shè)計(jì)模式有:代理、觀察者、單例。
(1)單例:它是用來(lái)限制一個(gè)類只能創(chuàng)建一個(gè)對(duì)象。這個(gè)對(duì)象中的屬性可以存儲(chǔ)全局共享的數(shù)據(jù)。所有的類都能訪問(wèn)、設(shè)置此單例中的屬性數(shù)據(jù)。
優(yōu)點(diǎn):是它只會(huì)創(chuàng)建一個(gè)對(duì)象容易供外界訪問(wèn),節(jié)約性能。
缺點(diǎn):是一個(gè)類只有一個(gè)對(duì)象,可能造成責(zé)任過(guò)重,在一定程度上違背了“單一職責(zé)原則”。單例模式中沒(méi)有抽象層,所以單例類的擴(kuò)展有很大的困難。不能過(guò)多創(chuàng)建單例,因?yàn)閱卫龔膭?chuàng)建到程序關(guān)閉前會(huì)一直存在,過(guò)多的單例會(huì)影響性能,浪費(fèi)系統(tǒng)資源。
(2)觀察者(KVO):它提供了觀察某一屬性變化的方法。當(dāng)指定對(duì)象的屬性發(fā)生改變后,它會(huì)自動(dòng)通知相應(yīng)的觀察者。
優(yōu)點(diǎn):能提供被觀察者屬性的新值與舊值。用keypaths來(lái)觀察屬性,因此也可以觀察嵌套對(duì)象。
缺點(diǎn):需要注冊(cè)觀察者,實(shí)現(xiàn)observeValueForKeyPath:方法,屬性可以通過(guò)KVC的方法來(lái)修改。否則觀察者收不到通知。
(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)引用問(wèn)題。
2、代理模式能否實(shí)現(xiàn)一對(duì)多的通信?
可以,采用多播委托的方式來(lái)實(shí)現(xiàn)。多播委托:它是指允許創(chuàng)建方法的調(diào)用列表或者鏈表的能力。當(dāng)多播委托被調(diào)用時(shí),列表中的方法均自動(dòng)執(zhí)行。
普通代理只能是一對(duì)一的回調(diào),無(wú)法做到一對(duì)多的回調(diào),而多播委托正式對(duì)delegate的一種擴(kuò)展與延伸,多了一個(gè)注冊(cè)和取消的過(guò)程。任何需要回調(diào)的對(duì)象都必須先注冊(cè)。
3、 重復(fù)注冊(cè)通知會(huì)有問(wèn)題嗎?
不會(huì)出現(xiàn)問(wèn)題,若多次發(fā)送同一通知,對(duì)方就會(huì)多次響應(yīng)。如果重復(fù)注冊(cè)通知,也會(huì)有多次響應(yīng)的效果。為了避免重復(fù)注冊(cè)通知而造成的錯(cuò)誤,建議每次注冊(cè)一個(gè)通知前,可以移除一次該通知。
4、項(xiàng)目中是否用過(guò)多線程編程?簡(jiǎn)述你常用的多線程實(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、簡(jiǎn)述NSOperationQueue與GCD的區(qū)別。
(1) GCD是底層的C語(yǔ)言構(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沒(méi)法停止已經(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是什么?簡(jiǎn)述KVO的實(shí)現(xiàn)原理。KVO能否監(jiān)聽數(shù)組?如何實(shí)現(xiàn)?
KVC:鍵值編碼,它是一種間接訪問(wèn)對(duì)象實(shí)例變量機(jī)制,可以不通過(guò)存取方法訪問(wèn)對(duì)象的實(shí)例變量。
KVO:鍵值觀察,它可以使對(duì)象獲取其他對(duì)象屬性變化的通知機(jī)制。
KVO是根據(jù)isa-swizzling技術(shù)來(lái)實(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、簡(jiǎn)單說(shuō)下C++,JAVA,Objective-C這幾種語(yǔ)言有什么區(qū)別?
Objective-C與JAVA都是單繼承語(yǔ)言,C++是多繼承語(yǔ)言。
Objective-C不支持命名空間機(jī)制,通過(guò)類名前面加前綴NS來(lái)區(qū)分。
Objective-C與JAVA不支持運(yùn)算符重載。
Objective-C協(xié)議可選實(shí)現(xiàn),JAVA的接口必須實(shí)現(xiàn)。
9、數(shù)組添加nil元素有問(wèn)題嗎?字典object與key可以設(shè)置為nil嗎?
會(huì)有問(wèn)題,數(shù)組中添加nil元素,程序會(huì)崩潰!報(bào)object cannot be nil錯(cuò)誤。字典的key不能為nil,否則會(huì)造成崩潰。字典的object也不能為nil。
10、oc中向一個(gè)nil對(duì)象發(fā)送消息會(huì)出現(xiàn)問(wèn)題嗎?
不會(huì)出現(xiàn)問(wèn)題,因?yàn)閛bjc是動(dòng)態(tài)語(yǔ)言,每個(gè)方法在運(yùn)行時(shí)會(huì)被動(dòng)態(tài)轉(zhuǎn)為消息發(fā)送。即:objc_msgSend(receiver,selector)。objc在向一個(gè)對(duì)象發(fā)送消息時(shí),runtime庫(kù)會(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之后再取出來(lái),這個(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、簡(jiǎn)述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、簡(jiǎn)述weak與assign的區(qū)別。
weak用來(lái)修飾對(duì)象,不能修飾基本數(shù)據(jù)類型。assign一般用來(lái)修飾基本數(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ù)(偽代碼)來(lái)表示上述機(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做下解釋:
總體說(shuō)來(lái),作用是: 通過(guò)objc_initWeak函數(shù)初始化“附有weak修飾符的變量(obj1)”,在變量作用域結(jié)束時(shí)通過(guò)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);
也就是說(shuō):
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)釋放池用過(guò)嗎?它是什么時(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)簡(jiǎn)要加以說(shuō)明。
iOS中數(shù)據(jù)持久化方式有:SQLite3數(shù)據(jù)庫(kù),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ù)庫(kù):SQLite是一個(gè)開源的嵌入式關(guān)系數(shù)據(jù)庫(kù)??梢浦残院?,容易使用,需要內(nèi)存開銷小。適合嵌入式設(shè)備。
CoreData:它可以使用SQLite保存數(shù)據(jù),而且不需要寫SQL語(yǔ)句。另外它還可以使用XML方式保存數(shù)據(jù)。要使用CoreData,需要在Xcode中的數(shù)據(jù)模型編輯器中設(shè)計(jì)好各個(gè)實(shí)體以及定義好他們的屬性和關(guān)系。通過(guò)操作這些對(duì)象來(lái)完成數(shù)據(jù)的持久化。
20、fmdb中支持多線程嗎?它是如何實(shí)現(xiàn)的!
支持多線程。它里面有個(gè)FMDatabaseQueue類。它看似是一個(gè)隊(duì)列,實(shí)際上它本身并不是,它繼承NSObject,通過(guò)內(nèi)部創(chuàng)建一個(gè)Serial的dipatch_queue_t來(lái)處理inDatabase和inTransaction傳入的Block,所以當(dāng)我們?cè)谥骶€程(或者后臺(tái))調(diào)用inDatabase或者inTransaction時(shí),代碼實(shí)際上是同步的。FMDatabaseQueue如此設(shè)計(jì)的目的是為了避免并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)的線程安全問(wèn)題,所有的數(shù)據(jù)庫(kù)訪問(wèn)都是同步執(zhí)行,比@synchronized與NSLock效率高。
21、簡(jiǎn)述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)用嗎?如果能,你說(shuō)明理由。
category的方法可以被子類繼承。category并不是絕對(duì)的覆蓋了類的同名方法,而是category的方法排在了類的同名方法之前,方法的檢索方式是順序檢索,所以在調(diào)用方法時(shí),調(diào)用到的同名方法是category,從而產(chǎn)生了覆蓋。
利用運(yùn)行時(shí)遍歷方法列表,可以調(diào)用被category覆蓋的方法。
23、 擴(kuò)展一個(gè)類的方式用繼承好還是category好?請(qǐng)說(shuō)明理由。
用類目好。因?yàn)槔^承還需要定義子類。類目不需要通過(guò)創(chuàng)建子類來(lái)增加現(xiàn)有類的方法。用category去重寫一個(gè)類的方法,僅僅只對(duì)本category有效,不會(huì)影響到其他類與原有類的關(guān)系。
24、 block有幾種類型?block的實(shí)現(xiàn)?
block分為三種類型:
_NSConcreteGlobalBlock
_NSConcreteStackBlock
_NSConcreteMallocBlock
block:匿名函數(shù)
25、 Swift用的多嗎?簡(jiǎn)單的說(shuō)說(shuō)1.0與2.0的區(qū)別。
swift2.0新增:guard語(yǔ)句,異常處理,協(xié)議擴(kuò)展,打印語(yǔ)句改變,avaliable檢查,do-while語(yǔ)句重命名:repeat-while,defer關(guān)鍵字
26、 在Swift用有沒(méi)有用過(guò)defer關(guān)鍵字?
對(duì)defer語(yǔ)句進(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)注意哪些問(wèn)題?
Objective-C中的協(xié)議默是必須實(shí)現(xiàn)的@require,使用協(xié)議的時(shí)候應(yīng)當(dāng)注意循環(huán)引用問(wèn)題,多個(gè)協(xié)議之間采用逗號(hào)分隔。
30、 Objective-C的協(xié)議與JAVA中的接口有什么區(qū)別?
OC中的協(xié)議可選實(shí)現(xiàn),JAVA中的接口必須實(shí)現(xiàn)。
31、 類目的應(yīng)用場(chǎ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文件夾是用來(lái)存放臨時(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ì)象來(lái)進(jìn)行初始化。
session task:負(fù)責(zé)處理數(shù)據(jù)的加載以及文件和數(shù)據(jù)在客戶端與服務(wù)器之間的上次和下載。
35、 簡(jiǎn)述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消息。