1.簡(jiǎn)述UIView與CALayer的區(qū)別
??? 兩者最大的區(qū)別是:
??? (1)圖層不會(huì)直接渲染到屏幕上噪径,UIView是IOS系統(tǒng)中?? 界面元素的基礎(chǔ),所有的界面元素都是繼承自它倦挂。
??? (2)UIView的繪圖部分是由一個(gè)CALayer類來管理的。UIView本身更像是一個(gè)CALayer的管理器。一個(gè)UIView上可以有多個(gè)CALayer,每個(gè)layer顯示一種東西,增強(qiáng)UIView的展現(xiàn)能力。
2.什么是“引用”黎茎?聲明和使用“引用”要注意哪些問題?
???? 引用就是某個(gè)目標(biāo)變量的“別名”当悔,對(duì)引用的操作與對(duì)變量直接操作效果完全相同傅瞻。聲明一個(gè)引??? 用的時(shí)候,切記要對(duì)其進(jìn)行初始化盲憎。引用聲明完畢后嗅骄,相當(dāng)于目標(biāo)變量有兩個(gè)名稱,即該目標(biāo)原??? 名稱和引用名焙畔,不能再把該引用明作為其他變量名的別名掸读。聲明一個(gè)引用,不是新定義了一個(gè)變??? 量,它只表示該引用名是目標(biāo)變量名的一個(gè)別名儿惫,他本身不是一種數(shù)據(jù)模型澡罚,因此引用本身不占??? 存儲(chǔ)單元,系統(tǒng)也不給引用分配存儲(chǔ)單元肾请。不能建立數(shù)組的一引用留搔。
3.類方法與對(duì)象方法的區(qū)別,alloc 和init的區(qū)別
??? 類方法是在程序中直接使用類名來調(diào)用的方法铛铁,對(duì)象方法是需要使用類的實(shí)例化變量來調(diào)用的方??? 法隔显,成員變量不可以在類方法中使用,成員變量是依附于對(duì)象存在的饵逐,如果必須使用成員變量的時(shí)候就要使用對(duì)象方法括眠。
??? alloc是給對(duì)象分配內(nèi)存空間的時(shí)候使用。
??? init的作用是給變量等進(jìn)行初始化倍权。
4.MVC簡(jiǎn)介
??? MVC:模型視圖控制器
??? M:model 模型 保存應(yīng)用程序的數(shù)據(jù)
??? V : view 視圖 顯示視圖
??? C:controller 控制器 在MVC(model-view-controller)設(shè)置模式中掷豺,充當(dāng)模型與視圖之間的??? ??? 橋梁,負(fù)責(zé)將模型中的數(shù)據(jù)傳到視圖上進(jìn)行顯示薄声。
??? MVC是一個(gè)框架模型当船,他強(qiáng)制性的使程序的輸入,處理和輸出分開默辨。使用MVC應(yīng)用程序被分成??? 三個(gè)核心部件:模型德频,視圖,控制器缩幸。
5.線程與進(jìn)程
??? 進(jìn)程:是指在系統(tǒng)中正在運(yùn)行的一個(gè)程序
??? ??? 每個(gè)進(jìn)程之間是獨(dú)立的壹置,每個(gè)進(jìn)程均運(yùn)行在其專用且受保護(hù)的內(nèi)存空間內(nèi)
??? 線程:1個(gè)進(jìn)程要想執(zhí)行任務(wù),必須得有線程(每一個(gè)進(jìn)程至少要有一條線程(主線程))桌粉。線程是進(jìn)程的基本執(zhí)行單元蒸绩,程序的所有任務(wù)都在線程中執(zhí)行。
??? 線程類型:主線程 多線程
??? 主線程:每個(gè)程序必須有主線程
??? 主線程作用:顯示铃肯、刷新UI界面 處理UI事件(比如點(diǎn)擊事件,滾動(dòng)事件传蹈,拖拽事件等)
??? 多線程:一個(gè)程序開啟多條線程押逼,每條線程可以同時(shí)執(zhí)行不同任務(wù)(如:下載圖片數(shù)據(jù))
??? 多線程優(yōu)點(diǎn):能適當(dāng)提高程序的執(zhí)行效率,能適當(dāng)提高資源利用率
??? 多線程的缺點(diǎn):1.開啟線程需要占用一定的內(nèi)存空間惦界,如果開啟大量的線程挑格,會(huì)占用大量的內(nèi)存空間,降低程序的性能沾歪。
2.程序設(shè)計(jì)更加復(fù)雜
6.緩存介紹
??? 使用緩存的目的是為了使用的應(yīng)用程序能更快速漂彤,使程序高效的運(yùn)行,有時(shí)候我們需要將遠(yuǎn)程??? web服務(wù)器的數(shù)據(jù)緩存起來,存放在沙盒的Documents文件夾中挫望,減少對(duì)同一個(gè)網(wǎng)絡(luò)數(shù)據(jù)的多次請(qǐng)求立润。
??? 作用:提高效率 節(jié)省流量 提高用戶體驗(yàn)
7.Autorelease pool
??? 自動(dòng)釋放池,是OC的一種內(nèi)存自動(dòng)回收機(jī)制媳板,可以將一些臨時(shí)變量通過自動(dòng)釋放池來回收統(tǒng)一釋放
??? 自動(dòng)釋放池本身銷毀的時(shí)候桑腮,池子里面所有的對(duì)象都會(huì)做一次release操作
(1)在自動(dòng)釋放池中alloc一個(gè)對(duì)象后(如p1),仍然需要用[p1 autorelease];只是這個(gè)語句和[p1 release]不同蛉幸,后者表示把p1的retainCount -1 破讨,而前者僅僅表示把p1放到自動(dòng)釋放池中返回一個(gè)self,自動(dòng)釋放池結(jié)束銷毀時(shí)奕纫,統(tǒng)一對(duì)里面的對(duì)象引用計(jì)數(shù) 減一
(2)自動(dòng)釋放池可以隨意創(chuàng)建提陶,也可以嵌套使用
(3)不管這個(gè)對(duì)象是在自動(dòng)釋放池內(nèi)還是外創(chuàng)建的,只要在自動(dòng)釋放池內(nèi)寫一個(gè)[p1 autorelease]匹层;p1就會(huì)被放到自動(dòng)釋放池中搁骑。注意autorelease是一個(gè)方法。且只有在自動(dòng)釋放池中使用才有效又固。
(4)如果把一個(gè)對(duì)象重復(fù)加到自動(dòng)釋放池中如[p1 autorelease];[p1 autorelease] 那么會(huì)出錯(cuò)仲器。原因是:加載幾次,屆時(shí)自動(dòng)釋放池就會(huì)用[p1 release];釋放幾次仰冠。 但是由于這兩個(gè)加載的對(duì)象其實(shí)是一個(gè)對(duì)象同樣地址乏冀,所以第一次自動(dòng)釋放正確,第二次自動(dòng)釋放時(shí)發(fā)現(xiàn)已經(jīng)被釋放了洋只,所以p1就成了野指針辆沦。
8.簡(jiǎn)述內(nèi)存分區(qū)情況
??? (1)代碼區(qū):存放函數(shù)二進(jìn)制代碼
??? (2)數(shù)據(jù)區(qū):系統(tǒng)運(yùn)行時(shí)申請(qǐng)內(nèi)存并初始化,系統(tǒng)退出時(shí)由系統(tǒng)釋放识虚。存放全局變量肢扯、靜態(tài)變量、常量
??? (3)堆區(qū):通過alloc等函數(shù)或者new等操作符動(dòng)態(tài)申請(qǐng)得到担锤,需程序員手動(dòng)申請(qǐng)和釋放蔚晨。
??? (4)棧區(qū):函數(shù)模塊內(nèi)申請(qǐng),函數(shù)結(jié)束時(shí)由系統(tǒng)自動(dòng)釋放肛循,存放局部變量铭腕,函數(shù)參數(shù)。
??? 另一種說法:代碼區(qū)多糠,靜態(tài)區(qū)累舷,常量區(qū),堆區(qū)夹孔、棧區(qū)
9.視圖的聲明周期
??? 當(dāng)一個(gè)視圖控制器被創(chuàng)建被盈,并在屏幕上顯示的時(shí)候析孽,代碼的執(zhí)行順序
??? (1)alloc??? 創(chuàng)建對(duì)象,分配空間
??? (2)init ??? ??? 初始化對(duì)象只怎,初始化數(shù)據(jù)
??? (3)loadView ??? ??? 從nib載入視圖袜瞬,通常這一步不需要去干涉。除非你沒有使用xib文件創(chuàng)建視??? ??? ??? ??? 圖
??? (4)viewDidLoad ??? 載入完成尝盼,可以進(jìn)行自定義數(shù)據(jù)以及動(dòng)態(tài)創(chuàng)建其他控件
??? (5)viewWillAppear??? 試圖將出現(xiàn)在屏幕之前吞滞,馬上這個(gè)視圖就會(huì)被展現(xiàn)在屏幕上了
??? (6)viewDidAppear??? 視圖已在屏幕上渲染完成
???
??? 當(dāng)一個(gè)視圖被移除屏幕并且銷毀的時(shí)候的執(zhí)行順序,這個(gè)順序差不多和上面的相反
??? (1)viewWillDisappear??? 試圖將被從屏幕上移除之前執(zhí)行
??? (2)viewDidDisappear??? 視圖已經(jīng)被從屏幕上移除盾沫,用戶看不到這個(gè)是圖了
??? (3)dealloc??? ??? ??? 試圖被銷毀裁赠,此處需要對(duì)你在init和viewDidLoad中創(chuàng)建的對(duì)象進(jìn)行釋放
10、類別的作用和局限性
??? 作用:(1)擴(kuò)充現(xiàn)有類的功能
(2)擴(kuò)充自定義類的功能赴精,將自定義類的方法進(jìn)行分類佩捞,使結(jié)構(gòu)更加清晰,調(diào)用更加方便蕾哟。
(3)聲明非正式的協(xié)議
(4)匿名分類(@interface類名()@end),一般在依賴類的.m文件的最上面生成匿名分類一忱,專門用來聲明私有的屬性和方法。
?? 局限性:普通類別只是對(duì)類的方法的拓展谭确,不能增加類的實(shí)例變量帘营,類別拓展的方法名如果和類的方法相同,那么在調(diào)用該方法的時(shí)候逐哈,就會(huì)被類別方法覆蓋芬迄,造成不能調(diào)用原類方法的目的,或者造成程序崩潰昂秃。
11禀梳、堆和棧的區(qū)別
對(duì)于棧來講,是由編譯器自動(dòng)管理肠骆,無需我們手工控制算途;對(duì)于堆來講,釋放工作有程序員控制蚀腿,容易產(chǎn)生memory Leak(內(nèi)存泄露)嘴瓤。
堆都是動(dòng)態(tài)分配的,沒有靜態(tài)分配的堆唯咬。棧有兩種分配方式:靜態(tài)分配和動(dòng)態(tài)分配纱注。靜態(tài)分配是編譯器完成的,比如局部變量的分配胆胰。動(dòng)態(tài)分配是由alloc函數(shù)進(jìn)行分配的,但是棧的動(dòng)態(tài)分配和堆是不同的刻获,他的動(dòng)態(tài)分配由編譯器進(jìn)行釋放蜀涨,無需我們手工實(shí)現(xiàn)瞎嬉。
棧(操作系統(tǒng))存放方法的參數(shù)值,局部變量的值等厚柳。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧氧枣;堆存放創(chuàng)建的對(duì)象等動(dòng)態(tài)數(shù)據(jù)。
12别垮、什么是延遲加載(懶加載)便监?
懶加載即重寫get 方法,此方法多用于已有的數(shù)據(jù)加載方法碳想,加載數(shù)據(jù)后賦值給數(shù)組烧董。
13、static靜態(tài)變量的作用
(1)表示全局靜態(tài)胧奔,用來修飾成員變量和成員方法逊移。
(2)被修飾的變量和方法獨(dú)立于該類的任何對(duì)象,即它不依賴類特定實(shí)例龙填,被類的所有實(shí)例共享胳泉。
(3)靜態(tài)方式可以直接通過類名調(diào)用,任何實(shí)力也可調(diào)用
(4)靜態(tài)變量可以不進(jìn)行外置聲明岩遗,直接調(diào)用扇商,使用靜態(tài)方法,不用實(shí)例化宿礁,創(chuàng)建類的對(duì)象案铺,使方法調(diào)用方便,節(jié)省空間窘拯。
(5)static成員是不能被其所在class創(chuàng)建的實(shí)例訪問红且,其默認(rèn)值是0,只要執(zhí)行一次涤姊,運(yùn)行時(shí)開辟全局內(nèi)存空間暇番,存儲(chǔ)上一次數(shù)據(jù),便于下一次調(diào)用思喊,對(duì)于實(shí)例變量壁酬,沒創(chuàng)建一個(gè)實(shí)例,就會(huì)為實(shí)例變量分配一次內(nèi)存恨课,實(shí)例變量可以在內(nèi)存中有多個(gè)拷貝舆乔,互不影響。
14剂公、get和post使用時(shí)的區(qū)別
(1)get是從服務(wù)器上去獲取數(shù)據(jù)希俩,post事項(xiàng)服務(wù)器傳輸數(shù)據(jù)(一般是用于圖片的傳輸)
(2)get是把參數(shù)數(shù)據(jù)隊(duì)列加到提交表單的ACTION屬性所指的URL中,值和表單內(nèi)各個(gè)字段一一對(duì)應(yīng)纲辽,在URL中可以看到颜武。post是通過HTTP post 機(jī)制璃搜,將表單內(nèi)各個(gè)字段與其內(nèi)容放置在HTML HEADER內(nèi)一起傳送到ACTION屬性所指的URL地址。用戶看到不到這個(gè)過程鳞上。
(3)對(duì)于get方式这吻,服務(wù)器端用Request。QueryString獲取變量的值篙议,對(duì)于post方式唾糯,服務(wù)器端用Request。Form獲取提交的數(shù)據(jù)鬼贱。
(4)get傳送的數(shù)據(jù)量小移怯。post傳送的數(shù)據(jù)量較大,一般被默認(rèn)為不受限制吩愧。
(5)get安全性非常低芋酌,post安全性較高。但是get的執(zhí)行效率卻比post方法好雁佳。
建議:
(1)get方式的安全性較post方式要差些脐帝,包含機(jī)密信息的話,建議使用post數(shù)據(jù)提交方式糖权。
(2)在做數(shù)據(jù)查詢時(shí)堵腹,建議使用get方式,而在做數(shù)據(jù)添加星澳,修改或刪除時(shí)疚顷,建議用post方式。
15.數(shù)據(jù)請(qǐng)求的方法:
NSURLConnection?????????? 系統(tǒng)的禁偎,常用的方式
NSURLSession???????????????? 系統(tǒng)的腿堤,IOS7.0之后出現(xiàn),使用了block如暖,提高了效率
ASIHttpRequest????????????? 第三方的笆檀,原來經(jīng)常使用的數(shù)據(jù)請(qǐng)求庫。缺點(diǎn):環(huán)境是MRC盒至,要進(jìn)行ARC與MRC之間的轉(zhuǎn)化酗洒,沒有使用block
AFNetworking????????????? 第三方的,現(xiàn)在被經(jīng)常使用枷遂,內(nèi)部集成了NSURLConnection和NSURLSession樱衷,環(huán)境是ARC,使用了block酒唉,提高了開發(fā)效率矩桂,不用系統(tǒng)庫的支撐。
16.@class和#import的區(qū)別
#import指令是Object-C針對(duì)#include的改進(jìn)版本痪伦,#import確保引用的文件只會(huì)被引用一次耍鬓,這樣你就不會(huì)陷入遞歸包含的問題中阔籽。
(1)#import包含被引用類所有的信息流妻,被引用類的變量和方法牲蜀;@class是前向聲明,只是告訴編譯器在某一個(gè)類的.h文件中聲明另外一個(gè)類绅这,沒有聲明具體信息涣达。
(2)使用@class只需要被引用類的名稱,在.m文件使用#import來包含被引用類的頭文件证薇,因?yàn)閷?shí)現(xiàn)類時(shí)需要用到被引用類的實(shí)例變量和方法度苔。
17、frame和bounds的區(qū)別浑度、contentSize寇窑、contentInset和contentOffset的區(qū)別
這幾個(gè)都是在ios程序中,經(jīng)常會(huì)注意到的一些小細(xì)節(jié)箩张,能否真正了解這些甩骏,對(duì)寫ios程序也有很大的好處。
首先先慷,frame和bounds的區(qū)別
frame是UIView中表示此view的一個(gè)矩形面積饮笛,包括了view在它的superview中的一些幾何上的標(biāo)識(shí)。有起始坐標(biāo)论熙,也就是origin(CGPoint)和這個(gè)矩形面積的寬(width)和高(height)
bounds每個(gè)view福青,除了有對(duì)應(yīng)它的superview的相關(guān)坐標(biāo)外,它自己的幾何坐標(biāo)脓诡,所以bounds就是標(biāo)識(shí)它自己做表關(guān)系的一個(gè)標(biāo)識(shí)无午,它有和frame一樣的屬性,但在數(shù)值上會(huì)有有些不同祝谚。
center是一個(gè)view的中心宪迟,默認(rèn)是這個(gè)view對(duì)應(yīng)superview坐標(biāo)的中間值。假如有個(gè)view-A,它是view-B的一個(gè)subview,view-A在view-B上的起始坐標(biāo)是(40踊跟,40)(此坐標(biāo)是view-B上的坐標(biāo))踩验,view-A的高(height)為380,寬(width)為240.所以商玫,view-A的frame值是(160,230).所以,frame和bounds是有關(guān)聯(lián)的箕憾,修改其中一個(gè)的寬或高,另一個(gè)也會(huì)相應(yīng)的改變拳昌。
contentSize,contentInset和cotentOffset區(qū)別
contentSize 是scrollview中的一個(gè)屬性袭异,它代表scrollview中的可顯示區(qū)域,假如有一個(gè)scrollview炬藤,它的frame為(0,0,320,480),而它的contentSize為(320,960)御铃。也就是說碴里,這個(gè)scrollview整個(gè)內(nèi)容的大小為(320,960),要通過上下滑動(dòng)scrollview來查看(320,480)后的內(nèi)容.
contentOffset 是scrollview當(dāng)前顯示區(qū)域頂點(diǎn)相對(duì)于frame頂點(diǎn)的偏移量上真,比如上個(gè)例子你拉到最下面咬腋,contentOffset就是(0,-480),也就是y偏移了480
contentInset是scrollview中contentView.frame.origin與scrollview.frame.origin的關(guān)系睡互,比如contentView的frame為(0,30,320,480),那么contentInset則為(0,30)
18根竿、copy,retain,assign,readonly,readwrite,strong,weak,nonatomic整理
copy:建立一個(gè)索引計(jì)數(shù)為1的對(duì)象,然后釋放舊對(duì)象就珠,修飾NSString.在賦值時(shí)使用傳入值的一份拷貝寇壳。拷貝工作由copy方法執(zhí)行妻怎,此屬性只對(duì)那些實(shí)行了NSCopying協(xié)議的對(duì)象類型有效壳炎。
retain:釋放舊對(duì)象,將舊對(duì)象的值賦予輸入對(duì)象逼侦,再提高輸入對(duì)象的索引計(jì)數(shù)為1匿辩,對(duì)其他NSObject和其子類。對(duì)參數(shù)進(jìn)行release舊值偿洁,再retain新值撒汉。
copy其實(shí)是建立了一個(gè)相同的對(duì)象,而retain不是涕滋。retain是指針拷貝睬辐,copy是內(nèi)容拷貝。
retain的set方法應(yīng)該是淺復(fù)制宾肺,copy的set方法應(yīng)該是深復(fù)制溯饵。
readonly 此標(biāo)記說明屬性是只讀。
readwrite此標(biāo)記說明屬性會(huì)被當(dāng)成讀寫锨用。
nonatomic:非原子性訪問丰刊,對(duì)屬性賦值的時(shí)候,不加鎖增拥,多線程并發(fā)訪問會(huì)提高性能啄巧。如果不加此屬性,則默認(rèn)是兩個(gè)訪問方法都為原子性事務(wù)訪問掌栅。
19秩仆、程序的生命周期
application didFinishLaunchingWithOptions:開始
applicationWillResignActive:變成不活躍
applicationDidEnterBackground:進(jìn)入后臺(tái)
applicationWillEnterForeground:進(jìn)入前臺(tái)
applicationDIdBecomeActive:變成活躍
applicationWillTerminate:即將關(guān)閉
20、bundle(沙盒):一個(gè)應(yīng)用只能在自己的沙盒中讀取或存儲(chǔ)文件猾封,而不能操作其他沙盒中的文件澄耍。好處:保護(hù)應(yīng)用的隱私不受侵犯。保護(hù)系統(tǒng)文件的安排,應(yīng)用刪除后相關(guān)文件也能被全部清除齐莲。
每個(gè)應(yīng)用都有自己的沙盒痢站,沙盒的根目錄的獲取方法是NSHomeDirectory()。
根目錄下的內(nèi)容:
- .app文件选酗,實(shí)際上是一個(gè)文件夾阵难,包含了可執(zhí)行文件,Nib文件星掰,圖片資源多望、plist等,Xcode中能看到的資源氢烘,及編譯后的可執(zhí)行文件,都封裝在app中
-Documents文件夾家厌,用于存放你的應(yīng)用所產(chǎn)生的數(shù)據(jù)播玖,該文件夾可以通過iTunes備份,可以存儲(chǔ)游戲進(jìn)度等
-Library文件夾饭于,用于存放用戶偏好和臨時(shí)文件
-tmp文件夾是系統(tǒng)的中轉(zhuǎn)站