? 4月10號(hào)跟公司提了辭職。說(shuō)好不會(huì)立馬走孕惜,留一兩個(gè)月的緩沖期給公司愧薛。這樣一來(lái),立馬辭職投簡(jiǎn)歷找工作的計(jì)劃也就擱淺了衫画。那么就趁這段時(shí)間,把自己已經(jīng)忘掉的基礎(chǔ)知識(shí)重新?lián)炱饋?lái)瓮栗,再?gòu)?fù)習(xí)一下削罩,整理成文檔以供自己查看吧。這些知識(shí)點(diǎn)是從網(wǎng)上各個(gè)地方看到的费奸,非原創(chuàng)弥激,僅是總結(jié)。
1.什么是MVVM愿阐?主要目的是什么微服??jī)?yōu)點(diǎn)有哪些?
1.View主要用于界面呈現(xiàn)缨历,與用戶輸入設(shè)備進(jìn)行交互以蕴。
2.ViewModel是MVVM架構(gòu)中最重要的部分,ViewModel中包含屬性辛孵,方法丛肮,事件,屬性驗(yàn)證等邏輯魄缚,負(fù)責(zé)View與Model之間的通訊
3.Model就是我們常說(shuō)的數(shù)據(jù)模型宝与,用于數(shù)據(jù)的構(gòu)造焚廊,數(shù)據(jù)的驅(qū)動(dòng),主要提供基礎(chǔ)實(shí)體的屬性习劫。
MVVM主要目的是分離視圖和模型
MVVM優(yōu)點(diǎn):低耦合室梅,可重用性,獨(dú)立開(kāi)發(fā)秉版,可測(cè)試
2.get請(qǐng)求與post請(qǐng)求的區(qū)別
1.get是向服務(wù)器發(fā)索取數(shù)據(jù)的一種請(qǐng)求陌凳,而post是向服務(wù)器提交數(shù)據(jù)的一種請(qǐng)求
2.get沒(méi)有請(qǐng)求體,post有請(qǐng)求體
3.get請(qǐng)求的數(shù)據(jù)會(huì)暴露在地址欄中须肆,而post請(qǐng)求不會(huì)匿乃,所以post請(qǐng)求的安全性比get請(qǐng)求號(hào)
4.get請(qǐng)求對(duì)url長(zhǎng)度有限制,而post請(qǐng)求對(duì)url長(zhǎng)度理論上是不會(huì)收限制的豌汇,但是實(shí)際上各個(gè)服務(wù)器會(huì)規(guī)定對(duì)post提交數(shù)據(jù)大小進(jìn)行限制幢炸。
3.談?wù)勀銓?duì)多線程開(kāi)發(fā)的理解?ios中有幾種實(shí)現(xiàn)多線程的方法拒贱?
好處:
1.使用多線程可以把程序中占據(jù)時(shí)間長(zhǎng)的任務(wù)放到后臺(tái)去處理宛徊,如圖片,視頻的下載逻澳;
2.發(fā)揮多核處理器的優(yōu)勢(shì)闸天,并發(fā)執(zhí)行讓系統(tǒng)運(yùn)行的更快,更流暢斜做,用戶體驗(yàn)更好苞氮;
缺點(diǎn):
1.大量的線程降低代碼的可讀性;
2.更多的線程需要更多的內(nèi)存空間瓤逼;
3當(dāng)多個(gè)線程對(duì)同一個(gè)資源出現(xiàn)爭(zhēng)奪的時(shí)候要注意線程安全的問(wèn)題笼吟。
ios有3種多線程編程的技術(shù):1.NSThread,2.NSOperationQueue霸旗,3.gcd贷帮;
3.XMPP工作原理;xmpp系統(tǒng)特點(diǎn)
原理:
1.所有從一個(gè)client到另一個(gè)client的jabber消息和數(shù)據(jù)都要通過(guò)xmpp server
2.client鏈接到server
3.server利用本地目錄系統(tǒng)的證書(shū)對(duì)其認(rèn)證
4.server查找诱告,連接并進(jìn)行相互認(rèn)證
5.client間進(jìn)行交互
特點(diǎn):1)客戶機(jī)/服務(wù)器通信模式撵枢;2)分布式網(wǎng)絡(luò);3)簡(jiǎn)單的客戶端精居;4)XML的數(shù)據(jù)格式
4.地圖的定位是怎么實(shí)現(xiàn)的锄禽?
1.導(dǎo)入了CoreLocation.framework
2.ios8以后,如果需要使用定位功能箱蟆,就需要請(qǐng)求用戶授權(quán)沟绪,在首次運(yùn)行時(shí)會(huì)彈框提示
3.通過(guò)本機(jī)自帶的gps獲取位置信息(即經(jīng)緯度)
5.蘋(píng)果內(nèi)購(gòu)實(shí)現(xiàn)流程
程序通過(guò)bundle存儲(chǔ)的plist文件得到產(chǎn)品標(biāo)識(shí)符的列表。
程序向App Store發(fā)送請(qǐng)求空猜,得到產(chǎn)品的信息绽慈。
App Store返回產(chǎn)品信息恨旱。
程序把返回的產(chǎn)品信息顯示給用戶(Appstore界面)
用戶選擇某個(gè)產(chǎn)品
程序向App Store發(fā)送支付請(qǐng)求
App Store處理支付請(qǐng)求并返回交易完成信息。
App獲取信息并提供內(nèi)容給用戶坝疼。
5.付寶搜贤,微信等相關(guān)類型的sdk的集成
1.在支付寶開(kāi)發(fā)平臺(tái)創(chuàng)建應(yīng)用并獲取APPID
2.配置密鑰
3.集成并配置SDK
4.調(diào)用接口(如交易查詢接口,交易退款接口)
6.gcd產(chǎn)生死鎖的原因及解鎖的方法
產(chǎn)生死鎖的必要條件:1.互斥條件钝凶,2.請(qǐng)求與保持條件仪芒,3.不剝奪條件,4.循環(huán)等待條件耕陷。
解決辦法:采用異步執(zhí)行block掂名。
7.生成二維碼的步驟
1.使用CIFilter濾鏡類生成二維碼
2.對(duì)生成的二維碼進(jìn)行加工,使其更清晰
3.自定義二維碼背景色哟沫、填充色
4.自定義定位角標(biāo)
5.在二維碼中心插入小圖片
8.是否使用過(guò)環(huán)信饺蔑,簡(jiǎn)單的說(shuō)下環(huán)信的實(shí)現(xiàn)原理
環(huán)信是一個(gè)即時(shí)通訊的服務(wù)提供商
環(huán)信使用的是XMPP協(xié)議,它是再XMPP的基礎(chǔ)上進(jìn)行二次開(kāi)發(fā)嗜诀,對(duì)服務(wù)器Openfire和客戶端進(jìn)行功能模型的添加和客戶端SDK的封裝猾警,環(huán)信的本質(zhì)還是使用XMPP,基于Socket的網(wǎng)絡(luò)通信
環(huán)信內(nèi)部實(shí)現(xiàn)了數(shù)據(jù)緩存隆敢,會(huì)把聊天記錄添加到數(shù)據(jù)庫(kù)发皿,把附件(如音頻文件,圖片文件)下載到本地拂蝎,使程序員更多時(shí)間是花到用戶體驗(yàn)體驗(yàn)上穴墅。
9.OC的理解與特性
1.OC作為一門(mén)面向?qū)ο蟮恼Z(yǔ)言,自然具有面向?qū)ο蟮恼Z(yǔ)言特性:封裝温自、繼承封救、多態(tài)。它既具有靜態(tài)語(yǔ)言的特性(如C++)捣作,又有動(dòng)態(tài)語(yǔ)言的效率(動(dòng)態(tài)綁定、動(dòng)態(tài)加載等)鹅士∪辏總體來(lái)講,OC確實(shí)是一門(mén)不錯(cuò)的編程語(yǔ)言掉盅,
2.Objective-C具有相當(dāng)多的動(dòng)態(tài)特性也拜,表現(xiàn)為三方面:動(dòng)態(tài)類型(Dynamic typing)、動(dòng)態(tài)綁定(Dynamic binding)和動(dòng)態(tài)加載(Dynamic loading)趾痘。動(dòng)態(tài)——必須到運(yùn)行時(shí)(run time)才會(huì)做的一些事情慢哈。
3.動(dòng)態(tài)類型:即運(yùn)行時(shí)再?zèng)Q定對(duì)象的類型,這種動(dòng)態(tài)特性在日常的應(yīng)用中非常常見(jiàn)永票,簡(jiǎn)單來(lái)說(shuō)就是id類型卵贱。事實(shí)上滥沫,由于靜態(tài)類型的固定性和可預(yù)知性,從而使用的更加廣泛键俱。靜態(tài)類型是強(qiáng)類型兰绣,而動(dòng)態(tài)類型屬于弱類型,運(yùn)行時(shí)決定接受者编振。
4.動(dòng)態(tài)綁定:基于動(dòng)態(tài)類型缀辩,在某個(gè)實(shí)例對(duì)象被確定后,其類型便被確定了踪央,該對(duì)象對(duì)應(yīng)的屬性和響應(yīng)消息也被完全確定臀玄。
5.動(dòng)態(tài)加載:根據(jù)需求加載所需要的資源,最基本就是不同機(jī)型的適配畅蹂,例如健无,在Retina設(shè)備上加載@2x的圖片,而在老一些的普通蘋(píng)設(shè)備上加載原圖魁莉,讓程序在運(yùn)行時(shí)添加代碼模塊以及其他資源睬涧,用戶可根據(jù)需要加載一些可執(zhí)行代碼和資源,而不是在啟動(dòng)時(shí)就加載所有組件旗唁,可執(zhí)行代碼可以含有和程序運(yùn)行時(shí)整合的新類畦浓。
10.簡(jiǎn)述內(nèi)存管理基本原則
之前:OC內(nèi)存管理遵循“誰(shuí)創(chuàng)建,誰(shuí)釋放检疫,誰(shuí)引用讶请,誰(shuí)管理”的機(jī)制,當(dāng)創(chuàng)建或引用一個(gè)對(duì)象的時(shí)候屎媳,需要向她發(fā)送alloc夺溢、copy、retain消息烛谊,當(dāng)釋放該對(duì)象時(shí)需要發(fā)送release消息风响,當(dāng)對(duì)象引用計(jì)數(shù)為0時(shí),系統(tǒng)將釋放該對(duì)象丹禀,這是OC的手動(dòng)管理機(jī)制(MRC)状勤。
目前:iOS 5.0之后引用自動(dòng)管理機(jī)制——自動(dòng)引用計(jì)數(shù)(ARC),管理機(jī)制與手動(dòng)機(jī)制一樣双泪,只是不再需要調(diào)用retain持搜、release、autorelease焙矛;它編譯時(shí)的特性葫盼,當(dāng)你使用ARC時(shí),在適當(dāng)位置插入release和autorelease村斟;它引用strong和weak關(guān)鍵字贫导,strong修飾的指針變量指向?qū)ο髸r(shí)抛猫,當(dāng)指針指向新值或者指針不復(fù)存在,相關(guān)聯(lián)的對(duì)象就會(huì)自動(dòng)釋放脱盲,而weak修飾的指針變量指向?qū)ο笠乇酰?dāng)對(duì)象的擁有者指向新值或者不存在時(shí)weak修飾的指針會(huì)自動(dòng)置為nil。
如果使用alloc钱反、copy(mutableCopy)或者retian一個(gè)對(duì)象時(shí),你就有義務(wù),向它發(fā)送一條release或者autorelease消息掖看。其他方法創(chuàng)建的對(duì)象,不需要由你來(lái)管理內(nèi)存。
向一個(gè)對(duì)象發(fā)送一條autorelease消息,這個(gè)對(duì)象并不會(huì)立即銷毀, 而是將這個(gè)對(duì)象放入了自動(dòng)釋放池,待池子釋放時(shí),它會(huì)向池中每一個(gè)對(duì)象發(fā)送 一條release消息,以此來(lái)釋放對(duì)象.
向一個(gè)對(duì)象發(fā)送release消息,并不意味著這個(gè)對(duì)象被銷毀了,而是當(dāng)這個(gè)對(duì)象的引用計(jì)數(shù)為0時(shí),系統(tǒng)才會(huì)調(diào)用dealloc方法,釋放該對(duì)象和對(duì)象本身它所擁有的實(shí)例面哥。
其他注意事項(xiàng)
如果一個(gè)對(duì)象有一個(gè)_strong類型的指針指向著哎壳,找個(gè)對(duì)象就不會(huì)被釋放。如果一個(gè)指針指向超出了它的作用域尚卫,就會(huì)被指向nil归榕。如果一個(gè)指針被指向nil,那么它原來(lái)指向的對(duì)象就被釋放了吱涉。當(dāng)一個(gè)視圖控制器被釋放時(shí)刹泄,它內(nèi)部的全局指針會(huì)被指向nil。用法“:不管全局變量還是局部變量用_strong描述就行怎爵。
局部變量:出了作用域特石,指針會(huì)被置為nil。
方法內(nèi)部創(chuàng)建對(duì)象鳖链,外部使用需要添加_autorelease;
連線的時(shí)候姆蘸,用_weak描述。
代理使用unsafe_unretained就相當(dāng)于assign芙委;
block中為了避免循環(huán)引用問(wèn)題逞敷,使用_weak描述;
聲明屬性時(shí)灌侣,不要以new開(kāi)頭推捐。如果非要以new開(kāi)頭命名屬性的名字,需要自己定制get方法名侧啼,如
1
@property(getter=theString) NSString * newString;
如果要使用自動(dòng)釋放池玖姑,用@autoreleasepool{}
ARC只能管理Foundation框架的變量,如果程序中把Foundation中的變量強(qiáng)制換成COre Foundation中的變量需要交換管理權(quán)慨菱;
在非ARC工程中采用ARC去編譯某些類:-fobjc-arc。
在ARC下的工程采用非ARC去編譯某些類:-fno-fobjc-arc戴甩。
11.如何理解MVC設(shè)計(jì)模式
MVC是一種架構(gòu)模式符喝,M表示MOdel,V表示視圖View甜孤,C表示控制器Controller:
Model負(fù)責(zé)存儲(chǔ)协饲、定義畏腕、操作數(shù)據(jù);
View用來(lái)展示書(shū)給用戶茉稠,和用戶進(jìn)行操作交互描馅;
Controller是Model和View的協(xié)調(diào)者,Controller把Model中的數(shù)據(jù)拿過(guò)來(lái)給View用而线。Controller可以直接與Model和View進(jìn)行通信铭污,而View不能和Controller直接通信。View與Controller通信需要利用代理協(xié)議的方式膀篮,當(dāng)有數(shù)據(jù)更新時(shí)嘹狞,MOdel也要與Controller進(jìn)行通信,這個(gè)時(shí)候就要用Notification和KVO誓竿,這個(gè)方式就像一個(gè)廣播一樣磅网,MOdel發(fā)信號(hào),Controller設(shè)置監(jiān)聽(tīng)接受信號(hào)筷屡,當(dāng)有數(shù)據(jù)更新時(shí)就發(fā)信號(hào)給Controller涧偷,Model和View不能直接進(jìn)行通信,這樣會(huì)違背MVC設(shè)計(jì)模式毙死。
11.Objective-C 中是否支持垃圾回收機(jī)制燎潮?
1.OC是支持垃圾回收機(jī)制的(Garbage collection簡(jiǎn)稱GC),但是apple的移動(dòng)終端中,是不支持GC的,Mac桌面系統(tǒng)開(kāi)發(fā)中是支持的.
2.移動(dòng)終端開(kāi)發(fā)是支持ARC(Automatic Reference Counting的簡(jiǎn)稱),ARC是在IOS5之后推出的新技術(shù),它與GC的機(jī)制是不同的。我們?cè)诰帉?xiě)代碼時(shí), 不需要向?qū)ο蟀l(fā)送release或者autorelease方法,也不可以調(diào)用delloc方法,編譯器會(huì)在合適的位置自動(dòng)給用戶生成release消息(autorelease),ARC 的特點(diǎn)是自動(dòng)引用技術(shù)簡(jiǎn)化了內(nèi)存管理的難度.
12.協(xié)議的基本概念和協(xié)議中方法默認(rèn)為什么類型规哲。
OC中的協(xié)議是一個(gè)方法列表,且多少有點(diǎn)相關(guān)跟啤。它的特點(diǎn)是可以被任何類使用(實(shí)現(xiàn)),但它并不是類(這里我們需要注意),自身不會(huì)實(shí)現(xiàn)這樣方法, 而是又其他人來(lái)實(shí)現(xiàn)協(xié)議經(jīng)常用來(lái)實(shí)現(xiàn)委托對(duì)象(委托設(shè)計(jì)模式)。如果一個(gè)類采用了一個(gè)協(xié)議,那么它必須實(shí)現(xiàn)協(xié)議中必須需要實(shí)現(xiàn)的方法,在協(xié)議中的方法默認(rèn)是必須實(shí)現(xiàn)(@required),添加關(guān)鍵字@optional,表明一旦采用該協(xié)議,這些“可選”的方法是可以選擇不實(shí)現(xiàn)的唉锌。
13.簡(jiǎn)述類目category優(yōu)點(diǎn)和缺點(diǎn)隅肥。
優(yōu)點(diǎn):
不需要通過(guò)增加子類而增加現(xiàn)有類的行為(方法),且類目中的方法與原始類方法基本沒(méi)有區(qū)別;
通過(guò)分類可以將龐大一個(gè)類的方法進(jìn)行劃分,從而便于代碼的日后的維護(hù)、更新以及提高代碼的閱讀性;
缺點(diǎn):
無(wú)法向類目添加實(shí)例變量,如果需要添加實(shí)例變量,只能通過(guò)定義子類的方式;
分類中的方法與原始類以及父類方法相比具有更高優(yōu)先級(jí),如果覆蓋父類的方法,可能導(dǎo)致super消息的斷裂袄简。因此,最好不要覆蓋原始類中的方法腥放。
14.類別的作用
給系統(tǒng)原有類添加方法,不能擴(kuò)展屬性绿语。如果類別中方法的名字跟系統(tǒng)的方法名一樣秃症,在調(diào)用的時(shí)候類別中的方法優(yōu)先級(jí)更高;
分散類的實(shí)現(xiàn):如:
+ (NSIndexPath *)indexPathForRow:(NSInteger)row
inSection:(NSInteger)section
原本屬于NSIndexPath的方法吕粹,但因?yàn)檫@個(gè)方法經(jīng)常使用的表的時(shí)候調(diào)用种柑、跟表的關(guān)系特別密切,因此把這個(gè)方法一類別的形式匹耕、聲明在UITableView.h中聚请。
聲明私有方法,某一個(gè)方法只實(shí)現(xiàn),不聲明驶赏,相當(dāng)于私有方法炸卑。
類別不能聲明變量,類別不可以直接添加屬性煤傍。property描述setter方法盖文,就不會(huì)報(bào)錯(cuò)。
14.NSNotification蚯姆、Block五续、Delegate和KVO的區(qū)別。
1.代理是一種回調(diào)機(jī)制蒋失,且是一對(duì)一的關(guān)系返帕,通知是一對(duì)多的關(guān)系,一個(gè)對(duì)向所有的觀察者提供變更通知篙挽;
2.效率:Delegate比NSNOtification高荆萤;
3.Delegate和Block一般是一對(duì)一的通信;
4.Delegate需要定義協(xié)議方法铣卡,代理對(duì)象實(shí)現(xiàn)協(xié)議方法链韭,并且需要建立代理關(guān)系才可以實(shí)現(xiàn)通信;
5.Block:Block更加簡(jiǎn)潔煮落,不需要定義繁瑣的協(xié)議方法敞峭,但通信事件比較多的話,建議使用Delegate蝉仇;
15.Objective-C中可修改和不可以修改類型旋讹。
可修改不可修改的集合類,就是可動(dòng)態(tài)添加修改和不可動(dòng)態(tài)添加修改轿衔。
比如NSArray和NSMutableArray,前者在初始化后的內(nèi)存控件就是固定不可變的沉迹,后者可以添加等,可以動(dòng)態(tài)申請(qǐng)新的內(nèi)存空間
16.當(dāng)我們調(diào)用一個(gè)靜態(tài)方法時(shí),需要對(duì)對(duì)象進(jìn)行 release 嗎?
不需要,靜態(tài)方法(類方法)創(chuàng)建一個(gè)對(duì)象時(shí),對(duì)象已被放入自動(dòng)釋放池害驹。在自動(dòng)釋放池被釋放時(shí),很有可能被銷毀鞭呕。
17.當(dāng)我們釋放我們的對(duì)象時(shí),為什么需要調(diào)用[super dealloc]方法,它的位置又是如何的呢?
因?yàn)樽宇惖哪承?shí)例是繼承自父類的,因此需要調(diào)用[super dealloc]方法, 來(lái)釋放父類擁有的實(shí)例,其實(shí)也就是子類本身的。一般來(lái)說(shuō)我們優(yōu)先釋放子類擁 有的實(shí)例,最后釋放父類所擁有的實(shí)例宛官。
18.static葫松、self、super關(guān)鍵字的作用
1.函數(shù)體內(nèi)static變量的作用范圍為該函數(shù)體底洗,不同于auto變量腋么,該變量的內(nèi)存只被分配一次,因此其值在下次調(diào)用時(shí)仍維持上次的值.
2.在模塊內(nèi)的 static 全局變量可以被模塊內(nèi)所用函數(shù)訪問(wèn)亥揖,但不能被模塊外其它函數(shù)訪問(wèn).
3.在模塊內(nèi)的static函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用党晋,這個(gè)函數(shù)的使用范圍被限制在聲明.
4.在類中的static成員變量屬于整個(gè)類所擁有,對(duì)類的所有對(duì)象只有一份拷貝.
5.self:當(dāng)前消息的接收者。
super:向父類發(fā)送消息未玻。
18.#include與#import的區(qū)別,#import 與@class 的區(qū)別
#include 和#import其效果相同,都是查詢類中定義的行為(方法);
#import不會(huì)引起交叉編譯,確保頭文件只會(huì)被導(dǎo)入一次胡控;
@class 的表明,只定 義了類的名稱,而具體類的行為是未知的,一般用于.h 文件扳剿;
@class 比#import 編譯效率更高。
此外@class 和#import 的主要區(qū)別在于解決引用死鎖的問(wèn)題昼激。
19.@public庇绽、@protected、@private 它們的含義與作用
@public:對(duì)象的實(shí)例變量的作用域在任意地方都可以被訪問(wèn) ;
@protected:對(duì)象的實(shí)例變量作用域在本類和子類都可以被訪問(wèn) ;
@private:實(shí)例變量的作用域只能在本類(自身)中訪問(wèn) .
20.isMemberOfClass 和 isKindOfClass 聯(lián)系與區(qū)別
聯(lián)系:兩者都能檢測(cè)一個(gè)對(duì)象是否是某個(gè)類的成員
區(qū)別:isKindOfClass 不僅用來(lái)確定一個(gè)對(duì)象是否是一個(gè)類的成員,也可以用來(lái)確定一個(gè)對(duì)象是否派生自該類的類的成員 ,而isMemberOfClass 只能做到第一點(diǎn)橙困。
舉例:如 ClassA派 生 自NSObject 類 , ClassA *a = [ClassA alloc] init];,[a isKindOfClass:[NSObject class]] 可以檢查出 a 是否是 NSObject派生類 的成員,但 isMemberOfClass 做不到瞧掺。
21.對(duì)象可以被copy的條件
只有實(shí)現(xiàn)了NSCopying和NSMutableCopying協(xié)議的類的對(duì)象才能被拷貝,分為不可變拷貝和可變拷貝,
NSCopying協(xié)議方法為:
- (id)copyWithZone:(NSZone *)zone {
MyObject *copy = [[[self class] allocWithZone: zone] init];
copy.username = [self.username copyWithZone:zone];
return copy;
}
21.自動(dòng)釋放池工作原理
自動(dòng)釋放池是NSAutorelease類的一個(gè)實(shí)例,當(dāng)向一個(gè)對(duì)象發(fā)送autorelease消息時(shí),該對(duì)象會(huì)自動(dòng)入池,待池銷毀時(shí),將會(huì)向池中所有對(duì)象發(fā)送一條release消息,釋放對(duì)象。
[pool release]凡傅、 [pool drain]表示的是池本身不會(huì)銷毀,而是池子中的臨時(shí)對(duì)象都被發(fā)送release,從而將對(duì)象銷毀辟狈。
22.解釋self = [super init]方法
容錯(cuò)處理,當(dāng)父類初始化失敗,會(huì)返回一個(gè)nil,表示初始化失敗。由于繼承的關(guān)系,子類是需要擁有父類的實(shí)例和行為,因此,我們必須先初始化父類,然后再初始化子類
23.定義屬性時(shí)夏跷,什么時(shí)候用 assign哼转、retain、copy 以及它們的之間的區(qū)別槽华。
assign:普通賦值,一般常用于基本數(shù)據(jù)類型,常見(jiàn)委托設(shè)計(jì)模式, 以此來(lái)防止循環(huán)引用壹蔓。(我們稱之為弱引用).
retain:保留計(jì)數(shù),獲得到了對(duì)象的所有權(quán),引用計(jì)數(shù)在原有基礎(chǔ)上加1.
copy:一般認(rèn)為,是在內(nèi)存中重新開(kāi)辟了一個(gè)新的內(nèi)存空間,用來(lái) 存儲(chǔ)新的對(duì)象,和原來(lái)的對(duì)象是兩個(gè)不同的地址,引用計(jì)數(shù)分別為1。但是當(dāng)copy對(duì)象為不可變對(duì)象時(shí),那么copy 的作用相當(dāng)于retain猫态。因?yàn)?這樣可以節(jié)約內(nèi)存空間
24.堆和棧的區(qū)別
1.棧區(qū)(stack)由編譯器自動(dòng)分配釋放 ,存放方法(函數(shù))的參數(shù)值, 局部變量的值等佣蓉,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域亲雪。即棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的勇凭。
2.堆區(qū)(heap)一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)由OS回收,向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)匆光,是不連續(xù)的內(nèi)存區(qū)域套像,從而堆獲得的空間比較靈活。
3.碎片問(wèn)題:對(duì)于堆來(lái)講终息,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù)夺巩,從而造成大量的碎片,使程序效率降低周崭。對(duì)于棧來(lái)講柳譬,則不會(huì)存在這個(gè)問(wèn)題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列续镇,他們是如此的一一對(duì)應(yīng)美澳,以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出.
4.分配方式:堆都是動(dòng)態(tài)分配的,沒(méi)有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配制跟。靜態(tài)分配是編譯器完成的舅桩,比如局部變量的分配。動(dòng)態(tài)分配由alloca函數(shù)進(jìn)行分配雨膨,但是棧的動(dòng)態(tài)分配和堆是不同的擂涛,他的動(dòng)態(tài)分配是由編譯器進(jìn)行釋放,無(wú)需我們手工實(shí)現(xiàn)聊记。
5.分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu)撒妈,計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專門(mén)的寄存器存放棧的地址,壓棧出棧都有專門(mén)的指令執(zhí)行排监,這就決定了棧的效率比較高狰右。堆則是C/C++函數(shù)庫(kù)提供的,它的機(jī)制是很復(fù)雜的舆床。
6.全局區(qū)(靜態(tài)區(qū))(static),全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊 的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域棋蚌。程序結(jié)束后有系統(tǒng)釋放。
文字常量區(qū)—常量字符串就是放在這里的峭弟。程序結(jié)束后由系統(tǒng)釋放附鸽。
程序代碼區(qū)—存放函數(shù)體的二進(jìn)制代碼
23.對(duì)于單元格重用的理解
當(dāng)單元格滑出屏幕時(shí),系統(tǒng)會(huì)把這個(gè)單元格添加到重用隊(duì)列中瞒瘸,等待被重用坷备,當(dāng)有新單元從屏幕外滑入屏幕內(nèi)時(shí),從重用隊(duì)列中找看有沒(méi)有可以重用的單元格情臭,若有省撑,就直接用,沒(méi)有就重新創(chuàng)建一個(gè)俯在。
24.解決cell重用的問(wèn)題
UITableView通過(guò)重用單元格來(lái)達(dá)到節(jié)省內(nèi)存的目的竟秫,通過(guò)為每個(gè)單元格指定一個(gè)重用標(biāo)示(reuseidentifier),即指定了單元格的種類跷乐,以及當(dāng)單元格滾出屏幕時(shí)肥败,允許恢復(fù)單元格以便復(fù)用。對(duì)于不同種類的單元格使用不同的ID愕提,對(duì)于簡(jiǎn)單的表格馒稍,一個(gè)標(biāo)示符就夠了。
如一個(gè)TableView中有10個(gè)單元格浅侨,但屏幕最多顯示4個(gè)纽谒,實(shí)際上iPhone只為其分配4個(gè)單元格的內(nèi)存,沒(méi)有分配10個(gè)如输,當(dāng)滾動(dòng)單元格時(shí)鼓黔,屏幕內(nèi)顯示的單元格重復(fù)使用這4個(gè)內(nèi)存央勒。實(shí)際上分配的cell的個(gè)數(shù)為屏幕最大顯示數(shù),當(dāng)有新的cell進(jìn)入屏幕時(shí)澳化,會(huì)隨機(jī)調(diào)用已經(jīng)滾出屏幕的Cell所占的內(nèi)存崔步,這就是Cell的重用。
對(duì)于多變的自定義Cell缎谷,這種重用機(jī)制會(huì)導(dǎo)致內(nèi)容出錯(cuò)刷晋,為解決這種出錯(cuò)的方法,把原來(lái)的
UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:defineString]
修改為:UITableViewCell *cell = [tableview cellForRowAtIndexPath:indexPath];
這樣就解決掉cell重用機(jī)制導(dǎo)致的問(wèn)題慎陵。
25.有a、b喻奥、c席纽、d 4個(gè)異步請(qǐng)求,如何判斷a撞蚕、b润梯、c、d都完成執(zhí)行甥厦?如果需要a纺铭、b、c刀疙、d順序執(zhí)行舶赔,該如何實(shí)現(xiàn)?
對(duì)于這四個(gè)異步請(qǐng)求谦秧,要判斷都執(zhí)行完成最簡(jiǎn)單的方式就是通過(guò)GCD的group來(lái)實(shí)現(xiàn):
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{ /*任務(wù)a */ });
dispatch_group_async(group, queue, ^{ /*任務(wù)b */ });
dispatch_group_async(group, queue, ^{ /*任務(wù)c */ });
dispatch_group_async(group, queue, ^{ /*任務(wù)d */ });
dispatch_group_notify(group,dispatch_get_main_queue(), ^{
// 在a竟纳、b、c疚鲤、d異步執(zhí)行完成后锥累,會(huì)回調(diào)這里
});
當(dāng)然,我們還可以使用非常老套的方法來(lái)處理集歇,通過(guò)四個(gè)變量來(lái)標(biāo)識(shí)a桶略、b、c诲宇、d四個(gè)任務(wù)是否完成际歼,然后在runloop中讓其等待,當(dāng)完成時(shí)才退出runloop焕窝。但是這樣做會(huì)讓后面的代碼得不到執(zhí)行蹬挺,直到Run loop執(zhí)行完畢。
解釋:要求順序執(zhí)行它掂,那么可以將任務(wù)放到串行隊(duì)列中巴帮,自然就是按順序來(lái)異步執(zhí)行了溯泣。
26.使用block有什么好處?使用NSTimer寫(xiě)出一個(gè)使用block顯示(在UILabel上)秒表的代碼榕茧。
代碼緊湊垃沦,傳值、回調(diào)都很方便用押,省去了寫(xiě)代理的很多代碼肢簿。
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0
repeats:YES
callback:^() {
weakSelf.secondsLabel.text = ...
}
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
27.一個(gè)view已經(jīng)初始化完畢,view上面添加了n個(gè)button蜻拨,除用view的tag之外池充,還可以采用什么辦法來(lái)找到自己想要的button來(lái)修改button的值。
有2種方法解決:
第一種:如果是點(diǎn)擊某個(gè)按鈕后缎讼,才會(huì)刷新它的值收夸,其它不用修改,那么不用引用任何按鈕血崭,直接在回調(diào)時(shí)卧惜,就已經(jīng)將接收響應(yīng)的按鈕給傳過(guò)來(lái)了,直接通過(guò)它修改即可夹纫。
第二種:點(diǎn)擊某個(gè)按鈕后咽瓷,所有與之同類型的按鈕都要修改值,那么可以通過(guò)在創(chuàng)建按鈕時(shí)將按鈕存入到數(shù)組中舰讹,在需要的時(shí)候遍歷查找茅姜。
28.線程與進(jìn)程的區(qū)別和聯(lián)系?
1.一個(gè)程序至少要有進(jìn)城,一個(gè)進(jìn)程至少要有一個(gè)線程。
2.進(jìn)程:資源分配的最小獨(dú)立單元,進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位跺涤。
3.線程:進(jìn)程下的一個(gè)分支,是進(jìn)程的實(shí)體,是CPU調(diào)度和分派的基本單元,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位,線程自己基本不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(程序計(jì)數(shù)器匈睁、一組寄存器、棧)桶错,但是它可與同屬一個(gè)進(jìn)程的其他線程共享進(jìn)程所擁有的全部資源航唆。
4.進(jìn)程和線程都是由操作系統(tǒng)所體會(huì)的程序運(yùn)行的基本單元,系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對(duì)應(yīng)用的并發(fā)性院刁。
5.進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式糯钙。進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后退腥,在保護(hù)模式下不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響任岸,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量狡刘,但線程之間沒(méi)有單獨(dú)的地址空間享潜,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯嗅蔬,但在進(jìn)程切換時(shí)剑按,耗費(fèi)資源較大疾就,效率要差一些。
但對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作艺蝴,只能用線程猬腰,不能用進(jìn)程。
29.多線程編程
NSThread:當(dāng)需要進(jìn)行一些耗時(shí)操作時(shí)會(huì)把耗時(shí)的操作放到線程中猜敢。線程同步:多個(gè)線程同時(shí)訪問(wèn)一個(gè)數(shù)據(jù)會(huì)出問(wèn)題姑荷,NSlock、線程同步塊缩擂、@synchronized(self){}鼠冕。
NSOperationQueue操作隊(duì)列(不需考慮線程同步問(wèn)題)。編程的重點(diǎn)都放在main里面胯盯,NSInvocationOperation供鸠、BSBlockOperation、自定義Operation陨闹。創(chuàng)建一個(gè)操作綁定相應(yīng)的方法,當(dāng)把操作添加到操作隊(duì)列中時(shí)薄坏,操作綁定的方法就會(huì)自動(dòng)執(zhí)行了趋厉,當(dāng)把操作添加到操作隊(duì)列中時(shí),默認(rèn)會(huì)調(diào)用main方法胶坠。
GCD(`Grand Central Dispatch)宏大的中央調(diào)度君账,串行隊(duì)列、并發(fā)隊(duì)列沈善、主線程隊(duì)列乡数;
同步和異步:同步指第一個(gè)任務(wù)不執(zhí)行完,不會(huì)開(kāi)始第二個(gè)闻牡,異步是不管第一個(gè)有沒(méi)有執(zhí)行完净赴,都開(kāi)始第二個(gè)。
串行和并行:串行是多個(gè)任務(wù)按一定順序執(zhí)行罩润,并行是多個(gè)任務(wù)同時(shí)執(zhí)行玖翅;
代碼是在分線程執(zhí)行,在主線程嘟列中刷新UI割以。
多線程編程是防止主線程堵塞金度、增加運(yùn)行效率的最佳方法。
Apple提供了NSOperation這個(gè)類严沥,提供了一個(gè)優(yōu)秀的多線程編程方法猜极;
一個(gè)NSOperationQueue操作隊(duì)列,相當(dāng)于一個(gè)線程管理器消玄,而非一個(gè)線程跟伏,因?yàn)槟憧梢栽O(shè)置這個(gè)線程管理器內(nèi)可以并行運(yùn)行的線程數(shù)量等丢胚。
多線程是一個(gè)比較輕量級(jí)的方法來(lái)實(shí)現(xiàn)單個(gè)應(yīng)用程序內(nèi)多個(gè)代碼執(zhí)行路徑。
iPhoneOS下的主線程的堆棧大小是1M酬姆。第二個(gè)線程開(kāi)始就是512KB嗜桌,并且該值不能通過(guò)編譯器開(kāi)關(guān)或線程API函數(shù)來(lái)更改,只有主線程有直接修改UI的能力辞色。