iOS基礎(chǔ)知識(shí)點(diǎn)回顧(1)

? 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的能力辞色。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末骨宠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子相满,更是在濱河造成了極大的恐慌层亿,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件立美,死亡現(xiàn)場(chǎng)離奇詭異匿又,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)建蹄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)碌更,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人洞慎,你說(shuō)我怎么就攤上這事痛单。” “怎么了劲腿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵旭绒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我焦人,道長(zhǎng)挥吵,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任花椭,我火速辦了婚禮忽匈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘矿辽。我一直安慰自己脉幢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布嗦锐。 她就那樣靜靜地躺著嫌松,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奕污。 梳的紋絲不亂的頭發(fā)上萎羔,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音碳默,去河邊找鬼贾陷。 笑死缘眶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的髓废。 我是一名探鬼主播巷懈,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼慌洪!你這毒婦竟也來(lái)了顶燕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤冈爹,失蹤者是張志新(化名)和其女友劉穎涌攻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體频伤,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恳谎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了憋肖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片因痛。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖岸更,靈堂內(nèi)的尸體忽然破棺而出婚肆,到底是詐尸還是另有隱情,我是刑警寧澤坐慰,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站用僧,受9級(jí)特大地震影響结胀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜责循,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一糟港、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧院仿,春花似錦秸抚、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至排惨,卻和暖如春吭敢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背暮芭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工鹿驼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欲低,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓畜晰,卻偏偏與公主長(zhǎng)得像砾莱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凄鼻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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

  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,160評(píng)論 30 470
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中腊瑟。。野宜。 其實(shí)如果沒(méi)有APIManager這一層是沒(méi)法使用delegate的扫步,畢竟多個(gè)單...
    yhtang閱讀 5,206評(píng)論 1 23
  • 序言 目前形勢(shì),參加到iOS隊(duì)伍的人是越來(lái)越多匈子,甚至已經(jīng)到供過(guò)于求了河胎。今年,找過(guò)工作人可能會(huì)更深刻地體會(huì)到今年的就...
    獨(dú)酌丿紅顏閱讀 2,375評(píng)論 18 60
  • 4月10號(hào)跟公司提了辭職虎敦。說(shuō)好不會(huì)立馬走游岳,留一兩個(gè)月的緩沖期給公司。這樣一來(lái)其徙,立馬辭職投簡(jiǎn)歷找工作的計(jì)劃也就擱淺了...
    tiGress閱讀 269評(píng)論 0 1
  • 幾乎每一首民謠都有一個(gè)難以忘懷的人也有一個(gè)難以忘懷的城市下面被民謠傳唱過(guò)的城市你也行能找到屬于自己的城市,自己的歌...
    足記閱讀 686評(píng)論 0 0