一. CALayer和UIView的區(qū)別聯(lián)系
1 UIView是UIKIt的只能在iOS使用, CALayer是QuartzCore的iOS和mac os通用
2 CALayer比UIView更加輕量級,但是可以實現(xiàn)同樣的效果
3 UIView的CALayer類似UIView的子View樹形結(jié)構(gòu)
4 UIView比CALayer多了一個事件處理功能,也就是說UIView能處理用戶觸摸
5 UIView有個重要的屬性layer,可以返回它的主CALayer實例.CALayer *layer = myView.layer
6坐標(biāo)系統(tǒng): CALayer的坐標(biāo)系統(tǒng)比UIView多了一個anchorPoint屬性
7 UIView是iOS系統(tǒng)中界面的基本元素,所有的界面元素都是繼承自它.它本身完全是由CoreAnimation來實現(xiàn)的.它真正的繪圖部分,是由一個CALayer類來管理的.UIView本身更像是一個CALayer的管理權(quán),訪問它的跟繪圖和跟坐標(biāo)有關(guān)的屬性,如frame,bounds等,實際上內(nèi)部都是在訪問它所包含的CALayer的相關(guān)屬性.
layer可以設(shè)置圓角顯示cornerRadius也可以設(shè)置陰影shadowColor但是如果layer中某個layer設(shè)置了圓角中所有l(wèi)ayer的陰影效果將都不顯示.因此要死設(shè)置有圓角還要陰影,可以做兩個UIView重疊,一個layer顯示圓角一個layer顯示陰影
8渲染當(dāng)更新層改變不能立即顯示在屏幕上.當(dāng)所有的層都準備好時,可以調(diào)用setNeedsDisplay方法來重繪顯示.
9變換要在一個層中添加一個3D或仿射變換,可以分別設(shè)置層的transform或者affineTransform屬性
10變形Quartz Core的渲染能力使二維圖像可以被自由的操縱,就像是三維的.圖像可以在一個三維坐標(biāo)系中以任意的角度被旋轉(zhuǎn)縮放和傾斜.CATransform3D的一套方法提供了一些魔術(shù)般的效果
二.簡述同步和異步
同步:串行的執(zhí)行任務(wù)異步:并行的執(zhí)行任務(wù).同步函數(shù)不具備開啟線程的能力,而異步函數(shù)具備
所謂同步,就是在發(fā)出一個調(diào)用時,在沒有得到結(jié)果之前,該調(diào)用就不返回.但是一旦調(diào)用返回,就得到返回值了.也就是由調(diào)用者主動等待這個調(diào)用結(jié)果
而異步則是相反,調(diào)用在發(fā)出之后,這個調(diào)用就直接返回了,所以沒有返回結(jié)果.換句話說就是當(dāng)一個異步過程調(diào)用發(fā)出后藻懒,調(diào)用者不會立刻得到結(jié)果剔猿。而是在調(diào)用發(fā)出后,被調(diào)用者通過狀態(tài)嬉荆、通知來通知調(diào)用者归敬,或通過回調(diào)函數(shù)處理這個調(diào)用.
三.多線程安全怎么控制?
用互斥鎖,隊列組,柵欄函數(shù),依賴
四.簡要說明什么時候使用繼承,什么時候使用類別
在OC中,一個類繼承另一個類,就是繼承了父類所有的屬性和方法,并且可以擴充自己的屬性:而類別是在不改變原有類的基礎(chǔ)上進行方法擴充;
因此,根據(jù)開發(fā)需求,如果這個類需要擴充屬性,或者需要重寫系統(tǒng)的類的某些方法,用繼承;如果只是對一個類擴充接口和模塊,使用類別更加方便.
五.簡述蘋果的安全機制
數(shù)字簽名機制:在iOS中運行的App必須擁有自己的數(shù)字簽名,而數(shù)字簽名來與開發(fā)者的數(shù)字證書;開發(fā)者需要加入"iOS開發(fā)者計劃"才能獲取證書而且其開發(fā)的App還要經(jīng)過嚴格的審查才能在AppStore上架,保證了App的安全;杜絕了第三方和未簽名App的運行;
沙盒保護機制:這種機制使得設(shè)備內(nèi)的各個App之間無法直接進行交流,只能通過iOS來進行數(shù)據(jù)傳遞;雖然降低了系統(tǒng)的擴展性但是卻保證了安全性;
不要使用越獄,否則蘋果的安全機制就功虧一簣;
只從AppStore獲取App;
第一次連接計算機,不要隨意點"信任";
不要隨意給某個App設(shè)置隱私讀取權(quán)限;
六關(guān)鍵字const有什么含意?修飾類呢?static的作用,用于類呢?還有extern c的作用?
當(dāng)使用const修飾基數(shù)數(shù)據(jù)類型變量時,該變量就變?yōu)槌A?進入靜態(tài)區(qū)
當(dāng)使用const修飾指針類型變量時:
當(dāng)使用const在指針類型兩邊,那么該指針變量指向的內(nèi)存空間的內(nèi)容就不能改變了,但指針的指向可以改變.
如果const在變量的左邊,那么該指針的指向不能改變了,而指向內(nèi)存空間的內(nèi)容可以改變
當(dāng)使用const修飾符時,const NSSting *str,相當(dāng)于修飾該對象,表示對象是不可更改的.
static修飾變量,表示這個內(nèi)部全局變量,只能在本文件中訪問.系統(tǒng)會將該變量放進靜態(tài)區(qū),它的生命周期被延長到了程序結(jié)束
static修飾類,表示這個內(nèi)部的方法,只能在本文件中訪問.
extern c表示聲明了一外部變量,多個外部變量如果同名,實際指向的是同一塊存儲空間.
七.類工廠方法是什么?
類工廠方法的實現(xiàn)是為了向客戶提供方便,它們將分配和初始化合在一個步驟中,返回被創(chuàng)建的對象,并進行自動釋放處理.這些方法的形式是+(type)className..其中className不包括任何前綴.工廠方法可能不僅僅為了方便使用,它們不但可以將分配和初始化合在一起,還可以為初始化過程提供對象的分配信息.類工廠方法的另一個目的是使類提供單間實例.
八UIView從出現(xiàn)到銷毀的過程?
-> loadView
-> viewDidLoad
-> viewWillAppear
-> viewWillLayoutSubviews
-> viewDidLayoutSubviews
-> viewDidAppear
-> viewWillDisappear
-> viewDidDisappear
九.什么情況下回發(fā)生內(nèi)存泄漏和內(nèi)存溢出?
內(nèi)存溢出就是你要求分配的內(nèi)存超出了系統(tǒng)能給你的,系統(tǒng)不能滿足需求,于是就產(chǎn)生溢出.
內(nèi)存泄漏就是指你向系統(tǒng)申請分配內(nèi)存進行使用,可以說使用完后沒有驚喜釋放,結(jié)果這塊內(nèi)存也無法分配給其他程序,稱之為內(nèi)存泄漏
內(nèi)存泄漏的累計危害非常大最后會導(dǎo)致內(nèi)存溢出程序閃退;
內(nèi)存泄漏分為四大類;
常發(fā)生內(nèi)存泄漏:發(fā)生內(nèi)存泄漏的代碼會被多次執(zhí)行到,每次被執(zhí)行的時候都會導(dǎo)致一塊內(nèi)存泄漏.
偶發(fā)生內(nèi)存泄漏.發(fā)生內(nèi)存泄漏的代碼只有在某些特定的壞境或者操作過程下才會發(fā)生;
一次性內(nèi)存泄漏.發(fā)生內(nèi)存泄漏的代碼只會被執(zhí)行一次,或者由于算法上的缺陷,導(dǎo)致總會有一塊僅且一塊內(nèi)存發(fā)生泄漏;
隱式內(nèi)存泄漏程序在運行的過程中不停的分配內(nèi)存,但是直到結(jié)束的時候才釋放內(nèi)存,對于運行周期很長的服務(wù)器,不及時釋放會耗盡內(nèi)存;
十說說響應(yīng)者鏈條?
響應(yīng)者鏈條是一條由UIResponder的子類組成的鏈條,它們都能夠響應(yīng)時間,由事件的最佳相應(yīng)者起,如果它是控制器的view的話,它的上一級響應(yīng)者就是這個控制器,否則就是它的父控件;控制器的上一級響應(yīng)者是它父控制器的view,最終一直到window.
SDWebImage基本使用
http://www.reibang.com/p/e614270a53c7
一. clear和clean的區(qū)別?
clear先把之前的緩存文件夾刪除掉,然后在新建一個文件夾
clean先刪除過期的文件,然后計算剩余緩存文件的大小(currrentSize)>maxSize,繼續(xù)刪除,按照它緩存文件創(chuàng)建的時間刪除,直到(currrentSize)<=maxSize
二.內(nèi)存緩存時間是多久?
一周
三.內(nèi)存緩存機制?
NSCache
四.最大并發(fā)數(shù)量
6條
五. SDWeblmage任務(wù)的執(zhí)行?是怎么實現(xiàn)的?
兩種:先進先出和先進后出
實現(xiàn):依賴來實現(xiàn)的
六.默認的緩存路徑
沙盒下的default下
七.怎么處理圖片的名稱?
對URL進行MD5加密
八.如何判讀圖片的第一個字節(jié)
得到二進制的第一個字節(jié)
九.使用什么來下載圖片的
NSURLConnection這個類,用代理方法下載圖片
十.默認的超時時間是多少?
15秒
-------------------加餐---------------------
十一.該框架內(nèi)部對內(nèi)存警告的處理方式?
監(jiān)聽系統(tǒng)發(fā)出的警告通知,然后清空內(nèi)存緩存
十二. NSCache和字典的區(qū)別
NSCache使用方法和可變字典類似80%它線程安全可設(shè)置緩存成本,通過代理方法能拿到被處理的對象
可以自動清理緩存數(shù)據(jù)
十三.如何計算圖片的成本?
長寬縮放比例*縮放比例
image.size.height * image.size.width * image.scale * image.scale
十四保證錯誤的URL不會被嘗試重新下載
因為內(nèi)部設(shè)置了一個黑名單(內(nèi)部是NSMutableset)
一. CGD的底層實現(xiàn)
iOS和OS X的核心是XNU內(nèi)核, GCD是基于XNU內(nèi)核實現(xiàn)的
GCD的API全部在libdispatch庫中
GCD的底層實現(xiàn)主要有Dispatch Queue和Dispatch Source
Dispatch Queue:管理block操作
Dispatch Source:處理事件
二. Notification是同步還是異步?kvo是同步還是異步
包括代理,這些都是同步的;監(jiān)聽和回調(diào)都是在同一個線程中執(zhí)行
三. Objective C中的selector是什么?
可以理解@selector()就是取類方法的編號,他的行為基本可以等同C語言中的函數(shù)指針,只不過C語言中,可以吧函數(shù)名之間賦給一個函數(shù)指針,而Objective-C的類不能之間應(yīng)用函數(shù)指針,這樣只能做一個@selector語法來取.
它的結(jié)果是一個SEL類型,這個類型的本質(zhì)是累方法的編號(函數(shù)地址).方法以selector為索引.selector的數(shù)據(jù)類型是SEL定義成char*,我們可以把它想象成int .每個方法的名字對應(yīng)一個唯一的值.
四.那些操作是屬于私有api的范疇?
私有API是指存放在PrivateFrameworks框架中的API是蘋果明確不能使用的API也可以說一般在官方文檔和頭文件中看不到,但是實際存在于框架中的API就是私有API,具體在提交應(yīng)用的時候回自動檢測.
私有API的存在很大一部分是為了保護隱私和系統(tǒng)安全,進制開發(fā)者使用這些功能.但是由于Objective-C的動態(tài)特性,使得實際上不可能存在真正意義的阻止調(diào)用這些API.
五. frame和bounds有什么不同
frame的位置是相對父空間的左上角來說的參照的是父類的坐標(biāo)系,指的是空間在父控件內(nèi)的位置和大小
bounds的位置是相對控件自身的左上角來說的,參照的是自身坐標(biāo)系,指的是自己本身的大小
六. NSTimer和GCD的定時器有什么區(qū)別
NSTimer可以調(diào)用invalidate進行撤銷,創(chuàng)建和撤銷必須在同一線程
NSTimer需要交定時器添加到當(dāng)前的runloop中
它的時間單位是秒
GCD一旦執(zhí)行就不能撤銷
GCD中的定時器不受runloop模式的影響
時間單位是納秒
七.應(yīng)用程序的沙盒下,都有哪些文件夾?它們有什么特點?本地緩存一般存在哪個文件下?
1 Documents
將應(yīng)用程序的數(shù)據(jù)文件保存在該目錄下.不過這些數(shù)據(jù)類型僅限于不可以再生的數(shù)據(jù),可再生的數(shù)據(jù)文件應(yīng)該存在LIbrary/Cache下
2 Library它有兩個子文件
caches主要是緩存文件,用戶使用過程中緩存都可以保存在這些目錄中.保存那些可再生的文件,比如網(wǎng)絡(luò)數(shù)據(jù)請求.因此,應(yīng)用程序通常還需要負責(zé)刪除這些文件.
Preferences應(yīng)用程序的偏好設(shè)置文件.我們使用NSUserDefaults寫的設(shè)置數(shù)據(jù)都會保存到該目錄下的一個plist文件中它會被iTunes同步
3. tmp
各種臨時文件,保存應(yīng)用再次啟動時不需要的文件.而且,當(dāng)應(yīng)用不在需要這些文件時應(yīng)主動將其刪除,因為該目錄下的東西隨時有可能被系統(tǒng)清除,目前已知的一種可能清理的原因是系統(tǒng)磁盤存儲空間不足的時候
八.為什么要使用第三方框架
使用第三方框架會大大的提高編碼效率
在完成功能時,三方框架一般性能優(yōu)于我們編寫的代碼
框架有許多值得我們學(xué)習(xí)的技術(shù)和思想
但第三方框架的使用也有缺點,比如正是因為用第三份框架所有在使用上回遇到一些意料之外的問題,比如框架作者不在更新框架
九.談?wù)勀銓VC的理解?
MVC是一種設(shè)計模式,它強制的將應(yīng)用程序的輸入鄙早、處理汪茧、和輸出分開。使用了MVC的應(yīng)用程序被分為3個核心部件:試圖(View)限番、模型(Model)舱污、控制器(Controller)。它們各司其職弥虐,既分工明確又相互合作匾竿。
首先視圖接受用戶輸入請求杆逗,然后將請求傳遞給控制器狈孔,控制器再調(diào)用某個模型來處理用戶的請求食店,在控制器的控制下,再將處理后的結(jié)果交給某個視圖進行格式化輸出給用戶颖对。MVC不僅實現(xiàn)了功能模塊和顯示模塊的分離捻撑,同時它還提高了系統(tǒng)的可維護性、可擴展性和組件的可復(fù)用性.
十. plist和pct文件的好處?
plist文件以便用來儲存數(shù)組或者字典,它是iOS中特有的存儲方式.它可以將數(shù)據(jù)與代碼隔離開,更便于數(shù)據(jù)的管理和展示.
pch里面可以保存一些全局的宏和頭文件.
pch是預(yù)編譯頭文件,其中存放有工程中已有編譯的部分代碼;在以后建立工程時就不用重新編譯這些代碼.
pch頭文件的內(nèi)容能被項目中的其他所有源文件共享訪問
存放一些全局的宏(整個項目都用得上的宏)
用來包含一些全部的頭文件(整個項目都用得上的頭文件)
能自動打開或者關(guān)閉日志的輸出功能
pch弊端:每個文件都會導(dǎo)入,有效率問題.
一.簡述iOS動畫機制
iOS分為顯式動畫,隱式動畫
顯式動畫:對一些屬性做指定的自定義動畫惜互,或者創(chuàng)建非線性動畫布讹,比如沿著任意一條曲線移動琳拭。
隱式動畫:主要是作用于非根層,也就是自己手動創(chuàng)建的layer,當(dāng)對它的一些屬性進行修改時,會自動產(chǎn)生一些動畫效果
二.什么是UIKit?
UIKit是iOS上的AppKit的變種训堆,用于為iOS應(yīng)用程序提供界面對象和控制器。
與AppKit類似白嘁,UIKit框架有UIResponder坑鱼,也采用事件(UIEvent類)機制。
另外絮缅,iOS上的應(yīng)用程序都是一個UIApplication實例鲁沥。所有的iOS應(yīng)用程序都基于UIKit ,它提供了在屏幕上繪制的機制,捕獲事件耕魄,和創(chuàng)建通用用戶界面元素画恰。
UIKit也通過管理顯示在屏幕上的組件來組織復(fù)雜的項目。
使用UIKit可以:
?構(gòu)建和管理你的用戶界面
?捕獲觸摸和基于移動的事件
?呈現(xiàn)文字和web內(nèi)容
?優(yōu)化你的多任務(wù)程序
?創(chuàng)建定制的用戶界面元素
三.三此握手,具體怎么交互?
第一次握手:客戶端發(fā)送syn(syn=j)包到服務(wù)器吸奴;并進入SYN_SEND狀態(tài)允扇,等待服務(wù)器確認
第二次握手:服務(wù)器收到syn包缠局,確認客戶的SYN(ack=j+1),同時自己也發(fā)送一個SYN包(syn=k),即SYN+ACK包考润,此時服務(wù)器進入SYN_RECV狀態(tài)
第三次握手:客戶端收到服務(wù)器的SYN+ACK包狭园,向服務(wù)器發(fā)送確認包ACK(ack=k+1),此包發(fā)送完畢糊治,客戶端和服務(wù)器進入ESTABLISHED狀態(tài)唱矛,完成三次握手。
注意:三次握手中發(fā)送的包不包含數(shù)據(jù)井辜,三次握手完畢绎谦,客戶端和服務(wù)器才正式開始傳送數(shù)據(jù)。TCP連接一旦建立抑胎,在通信雙方的任何一方主動關(guān)閉連接之前燥滑,TCP連接都將被一直保持下去
四.什么是安全釋放?
對象唄釋放的時候,指向nil
五.在iphone上有兩件事情要做,請問是在一個線程里按順序做效率高還是兩個線程里做效率高?
如果兩件事有依賴關(guān)系,事件二必須等到事件一執(zhí)行完畢才執(zhí)行,那么放在一個線程就可以了,如果兩者并沒有什么關(guān)聯(lián),放到兩個線程并發(fā)執(zhí)行效率較高
六. 4阿逃、NSArray和NSSet有何區(qū)別铭拧?
NSSet:里面存放的元素是無序的,不重復(fù)的,可以通過anyObject來訪問單個元素.在搜索一個一個元素時NSSet比NSArray效率高,主要是它用到了數(shù)據(jù)結(jié)構(gòu)中的哈希算法,而NSArray則是需要遍歷全部的數(shù)組元素,效率會低一些.
NSArray :里面存放的元素是有序的,可以有重復(fù)的對象,可以通過下標(biāo)來訪問里面的數(shù)組元素
七. __weak什么時候用?
當(dāng)兩個對象互相引用的時候,一端用strong,另一端必須用weak .例如: A擁有B, B也擁有A,那么必須一方使用weak
一般UI控件都可以使用weak,因為自身已經(jīng)對它進行一次強引用,沒有必要再強引用一次.
八.列舉幾個常用集合類和存放二進制數(shù)據(jù)類恃锉?
NSArray,NSDictionary,NSSet,以及他們的可變類
存放二進制的有NSData類
九.多線程搀菩,寫出常用的幾個類
Pthread
NSThread
GCD
NSOperationQueue
十.一般在哪個函數(shù)中創(chuàng)建某個View的子view?
viewDidLoad方法
一.用一個屬性引用UI控件的時候為什么可以用weak?
controller是被系統(tǒng)用強指針引用者只要它存在那么里面的子控件也就存在controller強引用著它的view controller又強引用著它的數(shù)組對象subviews數(shù)組對象又強引用著它所包含的數(shù)組內(nèi)容那么創(chuàng)建出來的一個UI控件將其加入subviews的時候那么就會被一個強指針?biāo)?/p>
內(nèi)存的合理使用當(dāng)控件我們需要的時候就已經(jīng)有一個強引用在引用著它我們就不必再弄一個強指針來強引用它當(dāng)我們不需要的時候weak直接釋放掉用strong的話就還會保留它這就還占著內(nèi)存了.
二. UITableView性能優(yōu)化的原理
iOS設(shè)備內(nèi)存有限如果使用UITableView顯示非常多的數(shù)據(jù)就需要非常多的UI TableViewcell
那么設(shè)備的內(nèi)存就會耗盡解決該問題就需重用UITableView對象
當(dāng)滾動出列表的時候部分UITableViewCell會移出窗口UITableView會將窗口外的UITableVIewcell放入一個對象緩存池中
當(dāng)UITableView要求dataSource返回UITableView時dataSource會先查看緩存池中是否有未使用的UITableViewCell有就用新的數(shù)據(jù)配置這個UITableViewCell重新使用到窗口就避免了重新創(chuàng)建對象
三.什么是抽象類有什么作用?能實例化嗎?
abstract修飾破托,它只能用來作父類肪跋,本身并沒有生成實例的能力
它將一類最公有的屬性和方法抽取出來抽象類是將類共有的方法抽取出來,聲明為抽象方法,抽象方法只有聲明沒有具體的實現(xiàn),擁有抽象方法的類就是抽象類;這樣新增一種類型時候只需要繼承抽象類土砂,實現(xiàn)抽象方法就可以了州既,降低了實現(xiàn)新類的難度。
抽象方法修飾符abstract抽象類不能被實現(xiàn)
如果一個類中沒有包含足夠的信息來描繪一個具體的對象萝映,這樣的類就是抽象類
為什么要有抽象類吴叶?
用于類型隱藏在面向?qū)ο箢I(lǐng)域,抽象類主要用來進行類型隱藏序臂。我們可以構(gòu)造出一個固定的一組行為的抽象描述蚌卤,但是這組行為卻能夠有任意個可能的具體實現(xiàn)方式。這個抽象描述就是抽象類奥秆。
用于拓展對象的行為功能
這一組任意個可能的具體實現(xiàn)則表現(xiàn)為所有可能的派生類(子類)逊彭,模塊可以操作一個抽象體。由于模塊依賴于一個固定的抽象體构订,因此它可以是不允許修改的侮叮;同時,通過從這個抽象體派生悼瘾,也可擴展此模塊的行為功能囊榜。
四. objc中向一個nil對象發(fā)送消息會發(fā)生什么?
沒事
五. runloop和線程有什么聯(lián)系?
Runloop和線程的關(guān)系:一個Runloop對應(yīng)著一條唯一的線程
問題:如何讓子線程不死
回答:給這條子線程開啟一個Runloop
Runloop的創(chuàng)建:主線程Runloop已經(jīng)創(chuàng)建好了谷异,子線程的runloop需要手動創(chuàng)建
Runloop的生命周期:在第一次獲取時創(chuàng)建,在線程結(jié)束時銷
六.什么是懶漢模式,一般用在哪些地方?
懶加載,指得是需要用到的時候才加載,其好處是節(jié)省內(nèi)存空間,不必一開始就創(chuàng)建所有的變量,用到了就創(chuàng)建一塊內(nèi)存,同時也加快了程序運行速度.一般用于我們只需要創(chuàng)建一次的變量就可以的地方,例如字典轉(zhuǎn)模型的數(shù)組,以及控制器的view等,都是懶加載的
七.常用的延時執(zhí)行的幾種方式?
perform selector
NSTimer
GCD:dispatch_after
八寫出你想到的設(shè)計模式,并簡要描述?
單例模式:不管怎么創(chuàng)建,拿到的對象都是同一個
MVC:MVC把軟件系統(tǒng)分為三個部分:Model锦聊,View歹嘹,Controller。MVC有低耦合性孔庭、高重用性尺上、可維護性等優(yōu)點
代理模式:代理模式就是實現(xiàn)消息傳遞的一種機制,委托方有一些任務(wù)自己不想完成,但是還需要要實現(xiàn),則將該任務(wù)存放到協(xié)議中,由代理完成.但是代理并不會主動的執(zhí)行任務(wù),需要委托方通知代理,然后代理完成委托方交給的任務(wù).
觀察者模式:經(jīng)典觀察者模式定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象圆到。這個主題對象在狀態(tài)上發(fā)生變化時怎抛,會通知所有觀察者對象,使它們能夠自動更新自己或者做出相應(yīng)的一些動作芽淡。比如KVO,通知中心
九.是否使用過CoreText或者CoreImage等马绝?如果使用過,請談?wù)勀闶褂肅oreText或者CoreImage的體驗挣菲?
用過
CoreText是用于處理文字和字體的底層技術(shù)富稻。Quartz能夠直接處理字體(font)和字形(glyphs),將文字渲染到界面上白胀,它是基礎(chǔ)庫中唯一能夠處理字形的模塊椭赋。因此,CoreText為了排版或杠,需要將顯示的文本內(nèi)容哪怔、位置、字體向抢、字形直接傳遞給Quartz认境。相比其它UI組件,由于CoreText直接和Quartz來交互挟鸠,所以它具有高速的排版效果叉信。
coreImage是IOS5中新加入的一個Objective-c的框架,提供了強大高效的圖像處理功能兄猩,用來對基于像素的圖像進行操作與分析. iOS提供了很多強大的濾鏡(Filter)茉盏,其中IOS5中有48種鉴未,而到了最新的IOS6 Filter已經(jīng)增加到了93種之多枢冤,并且這一數(shù)字會繼續(xù)增加。這些Filter提供了各種各樣的效果铜秆,并且還可以通過濾鏡鏈將各種效果的Filter疊加起來淹真,形成強大的自定義效果,如果你對該效果很滿意连茧,還可以子類化濾鏡
十. POST核蘸、GET的區(qū)別巍糯?
POST:將參數(shù)放在請求體中,參數(shù)的大小原則上沒有限制一般傳輸?shù)臄?shù)據(jù)包含隱私相關(guān)的用POST
GET:將參數(shù)附加在URL后面,因為URL長度的限制,所以參數(shù)的大小是有限制的,通常不能超過1KB
GET在請求URL后面以?的形式跟上發(fā)給服務(wù)器的參數(shù),多個參數(shù)之間用&隔開
一.有網(wǎng)絡(luò)鏈接的應(yīng)用中,在取得數(shù)據(jù)后將json字符串通過框架轉(zhuǎn)為NSDictionary或NSArray,很多人直接使用這些數(shù)據(jù)來更新UI,說說這樣做的缺點,并給出解決辦法?
在書寫的時候有可能寫錯Key值或者數(shù)組角標(biāo)
擴展性不好,且不符合MVC思想
會造成數(shù)據(jù)的重復(fù)下載,消耗用戶的流量,降低用戶體驗.
如果沒有網(wǎng)絡(luò)或者網(wǎng)絡(luò)堵塞,那么UI界面接受不到任何數(shù)據(jù),顯示不了任何內(nèi)容,用戶體驗糟糕;
解決的辦法就是通過框架轉(zhuǎn)換為字典或者數(shù)組后,在轉(zhuǎn)化模型,并進行二級緩存,需要顯示的時候從沙盒中取;
利用框架字典轉(zhuǎn)模型重寫命名
二. id聲明的對象有什么特征?
id聲明的對象具有運行時的特性,即可用指向任意類型的Objcetive-c的對象,與C中void*的萬能指針相似.
在編譯階段不知道它的真實類型,運行時才能知道它的真實類型,所以id類型也不能使用點語法是編譯時特性,而且id是運行時特性
三.你碰到那些導(dǎo)致程序閃退的原因?如何定位閃退的位置?
函數(shù)無線遞歸
運行時,找不到方法(沒實現(xiàn))
訪問了某個已經(jīng)被釋放的對象
程序占用內(nèi)存或CPU過高
子線程阻塞主UI線程過久
從Bundle加載了不存在或者不支持的對象
等等....
1在設(shè)置斷點的地方,選Add Exception Breakpoint.之后crash就會停在出錯的位置.
2如果是在測試階段報錯的話,可以在(設(shè)置-通用-關(guān)于本機-診斷與用量)里面看到崩潰的堆棧信息.
3如果用RAC的話,訪問到已經(jīng)釋放了的內(nèi)存,和內(nèi)存警告這2種粗出錯的幾率高一些
四.如何實現(xiàn)圓角矩形?有哪些方法可以實現(xiàn)扇形View?
直接修改view的樣式,系統(tǒng)提供好的了
view.layer.cornerRadius = 6;
view.layer.masksToBounds = YES;
用layer做就可以了,十分簡單.需要庫QuartzCore.framework客扎;
畫矩形直接利用UIBezierPath給我們封裝好的路徑方法
(x,y)點決定了矩形左上角的點在哪個位置
(width,height)是矩形的寬度高度
bezierPathWithOvalInRect:CGRectMake(x, y, width, height)
[UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 100, 100)];
圓角矩形的畫法多了一個參數(shù),cornerRadius
cornerRadius它是矩形的圓角半徑.
通過圓角矩形可以畫一個圓.當(dāng)矩形是正方形的時候,把圓角半徑設(shè)為寬度的一半,就是一個圓.
UIBezierPath*path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(50,50,100,100) cornerRadius:50];
扇形:
畫扇形的方法為:先畫一個圓孤再添加一個一根線到圓心,然后關(guān)閉路徑.
關(guān)閉路徑就會自動從路徑的終點到路徑的起點封閉起下
用填充的話,它會默認做一個封閉路徑,從路徑的終點到起點.
[path fill];
五. Cocoa Touch提供了哪幾種CoreAnimation過渡類型?
Cocoa Touch提供了4中Core Animation分別是交叉淡化推擠顯示和覆蓋.
六.能否向編譯后得到的類中增加實例變量?能否向運行時創(chuàng)建的類中添加實例變量,為什么?
不能向編譯后得到的類中增加實例變量
因為編譯后的類以及注冊在runtime中,類結(jié)構(gòu)同中objc_ivar_list實例變量的鏈表和instance_size實例變量的內(nèi)存大小已經(jīng)確定
同時runtime會調(diào)用class_setlvarLayout或class_setWeakIvarLayout來處理strong weak引用祟峦。所以不能向存在的類中添加實例變量
能向運行時創(chuàng)建的的類添加實例變量運行時創(chuàng)建的類是可以添加實例變量,調(diào)用class_addIvar函數(shù)徙鱼。但是得在調(diào)用objc_allocateClassPair之后宅楞,objc_registerClassPair之前,原因同上袱吆。
七.請寫出你調(diào)試解決crash問題的思路及步驟?1)把問題拆分成多個小問題厌衙,一步步檢驗,直到找到問題的根源點
2)程序運行后绞绒,查看log信息婶希,找到錯誤的地方
3)在錯誤的地方設(shè)置斷點進行調(diào)試,可以加條件斷點
4)查看斷點運行的信息蓬衡,進行修改
5).如果是在測試階段報錯的話喻杈,可以在(設(shè)置-通用-關(guān)于本機-診斷與用量)里面看到崩潰的堆棧信息。
6).如果用rac的話狰晚,訪問到已經(jīng)釋放了的內(nèi)存奕塑,和內(nèi)存警告這2種出錯幾率要高些。
八. NSDictionary類使用了哪些數(shù)據(jù)結(jié)構(gòu)和算法?
NSDictionary使用Hash表實現(xiàn)Key/Object存儲;
Hash表是一種訪問速度很快的數(shù)據(jù)結(jié)構(gòu)家肯,前提是Hash函數(shù)設(shè)計合理龄砰,能夠使數(shù)據(jù)在各個子節(jié)點均勻分布,這一點使用NSString對象可以保證讨衣,這是文檔中的說明:
Classes such as NSString that are part of Foundation have a good hash function.
九. iOS和iPhone做了哪些設(shè)計來降低功耗,延長續(xù)航時間?作為應(yīng)用的開發(fā)者,又如何避免費電?
iOS的省電機制主要有以下幾種:
強化的后臺機制
墓碑式:偽多任務(wù)换棚,應(yīng)用推至后臺后,雖然沒有被關(guān)閉反镇,但是所有活動都被凍結(jié)固蚤,只能通過蘋果服務(wù)器轉(zhuǎn)發(fā)的推送來與用戶交互
智能調(diào)度后臺:在一些指定類別的APP,比如社交歹茶、新聞類的應(yīng)用中夕玩,iOS系統(tǒng)會根據(jù)應(yīng)用啟動頻率、時間和當(dāng)前網(wǎng)絡(luò)和電量的狀況來智能分配每個應(yīng)用的后臺數(shù)據(jù)獲取頻率和啟動時長惊豺,開發(fā)者自己不能設(shè)置數(shù)據(jù)具體什么時候更新
真后臺:蘋果也提供一些有諸多限制的接口來保證真后臺燎孟,只供特定應(yīng)用行為調(diào)用,比如后臺音頻尸昧,定位揩页,上傳下載等。
作為開發(fā)者如何省電
?首先當(dāng)然優(yōu)化代碼烹俗,積極合理地使用runloop爆侣,多線程等技術(shù)萍程。
?其次是盡量少地調(diào)用一些費電的接口,比如頻繁的定位兔仰,頻繁的后臺更新數(shù)據(jù)茫负,如無必要,盡量不用乎赴。
十. ARC內(nèi)存管理原則是什么
永遠不寫retain,release和autorelease三個關(guān)鍵字就好~這是ARC的基本原則朽褪。
一. Notification和KVO有什么不同?KVO在ObjC中是怎么實現(xiàn)的无虚?
KVO:只能監(jiān)聽屬性值的變化,而且有一定的弊端;
在別處修改了屬性,也會調(diào)用KVO的方法,可能會造成數(shù)據(jù)錯亂
當(dāng)給一個對象添加監(jiān)聽后,會生成這個類的子類.NSKvoNotifying,并重寫被監(jiān)聽屬性的set方法;在開發(fā)中如果創(chuàng)建了同名的類,會報錯
使用Objective-C強大的runtime功能實現(xiàn)了這個功能缔赠。屬性類class中并沒有實現(xiàn)KVO通知的相關(guān)方案,而是在調(diào)用addObserver之后定義屬性類的子類subclass友题,subclass里邊實現(xiàn)了屬性的setter方法嗤堰,setter方法中實現(xiàn)發(fā)動通知的功能。然后subclass中實現(xiàn)class函數(shù)度宦,還讓返回屬性類的class踢匣,再讓屬性類對象的isa指向subclass,這樣就偽裝成表面上看還是屬性類自己實現(xiàn)的通知功能戈抄。通過原理我們可以看出必須使用屬性方法或者setValue:forKey方法賦值才會發(fā)送通知离唬,直接賦值是不會收到通知的
二. UIViewController類中didReceiveMemoryWarning默認的操作是什么?
當(dāng)程序接到內(nèi)存警告時View Controller將會收到這個消息:didReceiveMemoryWarning
從iOS3.0開始划鸽,不需要重載這個函數(shù)输莺,把釋放內(nèi)存的代碼放到viewDidUnload中去。
這個函數(shù)的默認實現(xiàn)是:檢查controller是否可以安全地釋放它的view(這里view指的是controller的view屬性)裸诽,比如view本身沒有superview并且可以被很容易地重建(從nib或者loadView函數(shù))嫂用。
如果view可以被釋放,那么這個函數(shù)釋放view并調(diào)用viewDidUnload丈冬。
你可以重載這個函數(shù)來釋放controller中使用的其他內(nèi)存嘱函。但要記得調(diào)用這個函數(shù)的super實現(xiàn)來允許父類(一般是UIVIewController)釋放view。
如果你的ViewController保存著view的子view的引用埂蕊,那么往弓,在早期的iOS版本中,你應(yīng)該在這個函數(shù)中來釋放這些引用蓄氧。而在iOS3.0或更高版本中函似,你應(yīng)該在viewDidUnload中釋放這些引用。
三.存放數(shù)字用什么類型匀们?存放CGRect用什么類缴淋?
NSNumber存放數(shù)字,NSValue可以存放CGrect
四.什么是沙箱模型
沙箱模型就是指iOS的每一個程序?qū)?yīng)到APP自己的一個目錄准给,這個目錄只有這個應(yīng)用有讀寫權(quán)限泄朴,其他任何APP都沒有這個目錄的讀寫權(quán)限重抖。這個APP對應(yīng)的這個目錄,就好比是這個app的沙箱祖灰。
沙箱的作用就是保證APP數(shù)據(jù)的安全性钟沛,防止惡意軟件、病毒等竊取信息局扶。
五.簡述HTTP通信中的阻塞與非阻塞方式
阻塞模式和非阻塞模式的主要區(qū)別在于無請求來到時恨统,阻塞模式會一直停在接收函數(shù)即accep函數(shù),直到有請求到來才會繼續(xù)向下進行處理三妈。
而非阻塞模式下畜埋,運行接收函數(shù),如果有請求畴蒲,則會接收請求悠鞍,如果無請求,會返回一個負值模燥,并繼續(xù)向下運行咖祭。一般來說,使用阻塞模式
的程序比較多蔫骂,因為阻塞模式是由內(nèi)核保障等待請求的么翰,當(dāng)他阻塞時不占用系統(tǒng)資源,而非阻塞模式需要我們?nèi)斯ぽ喸兞尚加觅Y源較多浩嫌。
另外,阻塞模式可以使用select函數(shù)設(shè)置超時時間补胚,具體可以參考相關(guān)書籍固该。
六. HTTP報文中Content-type有和作用
在Http協(xié)議消息頭中,使用Content-Type來表示具體請求中的媒體類型信息
七.如何用css實現(xiàn)文字陰影
CSS中有兩種陰影效果,一種是DropShadow(投影),另一種是Shadow(陰影).
(1)DropShadow
語法
{FILTER:DropShadow(Color=color,OffX=offX,OffY=offY,Positive=positive)}
Color代表投影的顏色糖儡,格式為“#RRGGBB”
OffX和OffY代表x和y方向的投影偏移量伐坏。必須用整數(shù)值,正數(shù)代表x軸的右方向和y軸的下方向握联。負值相反桦沉。
Positive參數(shù)是一個布爾值。值為true(非0),那么就為任何的非透明像素建立可見的投影金闽。如果值為false(0)埠褪,那么就為
透明的像素部分建立可見的投影。
(2)Shadow
語法
{FILTER:Shadow(Color=color,Direction=direction)}
Color代表陰影的顏色渴语,格式為“#RRGGBB”
Direction是設(shè)置投影的方向窟哺,按照順時針方向進行殖告,0度代表垂直向上,然后每45度為一個單位碑宴。默認值是向左的270度贿条。共8個方向票顾。
八. NSTimer是否是多線程的?使用時是否要加同步鎖?
不是,只能加到RunLoop中特定模式下才能工作;不需要,因為它只在單一線程工作
九. main函數(shù)執(zhí)行之前和執(zhí)行之后,有可能分別會執(zhí)行什么代碼
全局對象的構(gòu)造函數(shù)會在main函數(shù)之前執(zhí)行,
全局對象的析構(gòu)函數(shù)會在main函數(shù)之后執(zhí)行熔吗;
用atexit注冊的函數(shù)也會在main之后執(zhí)行。
一些全局變量嗜暴、對象和靜態(tài)變量触徐、對象的空間分配和賦初值就是在執(zhí)行main函數(shù)之前,而main函數(shù)執(zhí)行完后,還要去執(zhí)行一些諸如釋放空間撞鹉、釋放資源使用權(quán)等操作
進程啟動后享郊,要執(zhí)行一些初始化代碼(如設(shè)置環(huán)境變量等)舔清,然后跳轉(zhuǎn)到main執(zhí)行。全局對象的構(gòu)造也在main之前曲初。
十.父類未實現(xiàn)的delegate是否可以由子類實現(xiàn)
可以,父類遵守的協(xié)議,子類也會繼承這個協(xié)議
一.請簡述iOS中Push原理
第一階段:應(yīng)用程序把要發(fā)送的消息目的iPhone的標(biāo)識打包,發(fā)給APNS.
第二階段:APNS在自身的已注冊Push服務(wù)的iPhone列表中,查找有相應(yīng)標(biāo)識的iPhone,并把消息發(fā)送到iPhone.
第三階段:iPhone把發(fā)來的消息傳遞給相應(yīng)的應(yīng)用程序,并且按照設(shè)定彈出Push通知
二. iOS7和iOS7以下常見的兼容性問題和解決方法?
baseline
原因:autolayout自動加了baseline的constraints抒痒,而baseline只有iOS8以后才有,兼容iOS7就崩潰了
解決:直接移除baseline相關(guān)的constraint即可目锭。
[[UINavigationBar appearance] setTranslucent:NO]
原因iOS8.0之后[UINavigationBar appearance]才可以setTranslucent评汰,兼容iOS7需要添加判斷
解決:兼容iOS7需要添加判斷
if(IOS8_OR_LATER && [UINavigationBarconformsToProtocol:@protocol(UIAppearanceContainer)]) {
[[UINavigationBar appearance] setTranslucent:NO];
}
storyboard segue show
原因:在iOS7下如果沒有設(shè)置navigationController為initController,show會自動將push轉(zhuǎn)換成modal痢虹。簡而言之就是在sb里每個show的segue
解決:保證它的初始位置有個navigationController被去。
constrain to margin
原因:這是設(shè)置了constrain to margins的關(guān)系,這玩意也是iOS8后才有的
scrollerView
原因:找不到setAutomaticallyAdjustsScrollViewInsets:方法
解決:重寫方法setAutomaticallyAdjustsScrollViewInsets:
三.怎么用copy關(guān)鍵字
一般使用retain或者strong修飾屬性時,是使用引用對象的指針指向同一對象,即為同一塊內(nèi)存地址.只要其中有一個指針變量被修飾時所有其他引用該對象的變量都會被改變
而使用copy關(guān)鍵字修飾在賦值時是釋放舊對象,拷貝新對象內(nèi)容.重新分配了內(nèi)存地址.以后該指針變量被修改時就不會影響舊對象的內(nèi)容了.
copy只有實現(xiàn)了NSCopying協(xié)議的對象類型才有效,常用于NSString和Block
四.這個寫法會出什么問題
@@property (copy) NSMutableArray *array;
當(dāng)一個NSMutableArray對象使用initWithArray:初始化方法創(chuàng)建時奖唯,并將該對象賦值給了array屬性惨缆。那么之后array執(zhí)行可變數(shù)組的方法,如:removeObjectAtIndex:時會出現(xiàn)unrecognized selector sent to instance的崩潰。原因在于array屬性在被賦值(setter)的時候默認執(zhí)行了copy方法后變?yōu)榱瞬豢勺僋SArray對象丰捷。
五.如何讓自己的類用copy修飾符坯墨?如何重寫帶copy關(guān)鍵字的setter?
該類必須要實現(xiàn)NSCopying協(xié)議病往。實現(xiàn)- (id)copyWithZone:(NSZone *)zone;方法捣染。
重寫copy關(guān)鍵字的setter時,需要調(diào)用一下傳入對象的copy方法停巷。然后賦值給該setter的方法對應(yīng)的成員變量榕栏。
六.怎樣防止指針的越界使用問題?
防止數(shù)組越界,必須讓指針指向一個有效的內(nèi)存地址,
防止向一塊內(nèi)存中拷貝過多的內(nèi)容
防止使用空指針
防止改變const修改的指針
防止改變指向靜態(tài)存儲區(qū)的內(nèi)容
防止兩次釋放一個指針
防止使用野指針
七. http請求方式有哪些蕾各?
GET
HEAD
PUT
DELETE
POST
OPTIONS
八.屬性readwrite扒磁,readonly,assign式曲,retain妨托,copy,nonatomic各是什么作用吝羞,在那種情況下用?
readwrite是可讀可寫特性;需要生成getter方法和setter方法時
readonly是只讀特性只會生成getter方法不會生成setter方法;不希望屬性在類外改變
assign是賦值特性兰伤,setter方法將傳入?yún)?shù)賦值給實例變量;僅設(shè)置變量時;
retain表示持有特性,setter方法將傳入?yún)?shù)先保留脆贵,再賦值医清,傳入?yún)?shù)的retaincount會+1;
copy表示賦值特性起暮,setter方法將傳入對象復(fù)制一份;需要完全一份新的變量時卖氨。
nonatomic非原子操作,決定編譯器生成的setter getter是否是原子操作负懦,atomic表示多線程安全筒捺,
一般使用nonatomic
九. http的post與get區(qū)別與聯(lián)系,實踐中如何選擇它們纸厉?
get是從服務(wù)器上獲取數(shù)據(jù),post是向服務(wù)器傳送數(shù)據(jù).
get方式提交數(shù)據(jù)最多只能有1kB,而POST一般沒有限制.
安全性問題,使用get參數(shù)會在URL中,而pot不會,所以用戶輸入的數(shù)據(jù)包含敏感數(shù)據(jù)用post.
十.檢查內(nèi)存管理問題的方式有哪些?
Xcode自帶檢測工具.
一. @property的本質(zhì)是什么?ivar,getter.setter是如何生成并添加到這個類中的.
property在編譯時編譯器會自動的為我們生成一個私有成員變量和setter與getter方法的聲明和實現(xiàn).反編譯property大致生成五個東西
OBJC IVAR $類名$屬性名稱該屬性的偏移量
setter與getter方法對應(yīng)的實現(xiàn)函數(shù)
ivar_list就是成員變量列表
method_list方法列表
prop_list屬性列表
也就是說我們每次增加一個屬性,系統(tǒng)都會在ivar_list中添加一個成員變量的描述,在method_list中增加setter與getter方法的描述,在屬性列表中增加一個屬性的描述,然后計算該屬性在對象中的偏移量,然后產(chǎn)生setter與getter方法對應(yīng)的實現(xiàn),在setter方法方法中從偏移量的位置開始賦值,在getter方法中從偏移量開始取值,為了能夠讀取正確字節(jié)數(shù),系統(tǒng)對象偏移量的指針類型進行了類型強轉(zhuǎn)系吭。
二. @synthesize和@dynamic分別有什么作用
@property有兩個對應(yīng)的詞,一個是@synthesize颗品,一個是@dynamic肯尺。如果@synthesize和@dynamic都沒寫,那么默認的就是@syntheszie var = var躯枢,var為property變量则吟。可以手動修改屬性var對應(yīng)的實例變量锄蹂。例如:@syntheszie var = var1
@synthesize的語義是如果你沒有手動實現(xiàn)setter方法和getter方法氓仲,那么編譯器會自動為你加上這兩個方法,在Xcode4.4之后的版本可以省略不寫.
@dynamic告訴編譯器不要自動生成成員變量的getter和setter方法,而是開發(fā)者自己手工生成或者運行時生成.
三.用@property聲明的NSString(或NSArray得糜,NSDictionary)經(jīng)常使用copy關(guān)鍵字敬扛,為什么?如果改用strong關(guān)鍵字朝抖,可能造成什么問題啥箭?
使用copy的目的是為了讓本對象的屬性不受外界影響,使用copy無論給我傳入一股可變對象還是不可對象,我本身就是一股不可變副本.
如果使用strong.這個屬性有可能指向一個可變對象,如果這個可變對象唄外部意外的修改了,由于可變對象唄改變之后起始地址不會發(fā)生變化.而strong修飾的屬性依然會指向這塊內(nèi)存地址,下次讀取的時候就會是被改變以后的對象了,也就是說strong可能會被外部意外修改.
四.屬性readwrite,readonly治宣,assign急侥,retain抬驴,copy,nonatomic各是什么作用缆巧,在那種情況下用?
readwrite是可讀可寫特性;需要生成getter方法和setter方法時
readonly是只讀特性只會生成getter方法不會生成setter方法;不希望屬性在類外改變
assign是賦值特性布持,setter方法將傳入?yún)?shù)賦值給實例變量;僅設(shè)置變量時;
retain表示持有特性,setter方法將傳入?yún)?shù)先保留陕悬,再賦值题暖,傳入?yún)?shù)的retaincount會+1;
copy表示賦值特性,setter方法將傳入對象復(fù)制一份;需要完全一份新的變量時捉超。
nonatomic非原子操作胧卤,決定編譯器生成的setter getter是否是原子操作,atomic表示多線程安全拼岳,
一般使用nonatomic
五.原子(atomic)跟非原子(non-atomic)屬性有什么區(qū)別?
atomic提供多線程安全枝誊。是防止在寫未完成的時候被另外一個線程讀取,造成數(shù)據(jù)錯誤
non-atomic:在自己管理內(nèi)存的環(huán)境中惜纸,解析的訪問器保留并自動釋放返回的值叶撒,如果指定了nonatomic,
那么訪問器只是簡單地返回這個值耐版。
六.在iOS應(yīng)用中如何保存數(shù)據(jù)
通過web服務(wù),保存在服務(wù)器上
通過NSCoder固化機制,講對象保存在文件中
通過Sqlite或CoreData保存在文件數(shù)據(jù)庫中
七.關(guān)鍵字volatile有什么含義祠够?并給出三個不同例子
一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣粪牲,編譯器就不會去假設(shè)這個變量的值了古瓤。精確地說就是,
優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值腺阳,而不是使用保存在寄存器里的備份落君。
下面是volatile變量的幾個例子:
1)并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)
2)一個中斷服務(wù)子程序中會訪問到的非自動變量(Non-automatic variables)
3)多線程應(yīng)用中被幾個任務(wù)共享的變量
八.一個指針可以是volatile么?解釋為什么
可以是
盡管這種情況并不常見,但它還是可以,例如
當(dāng)一個中斷服務(wù)子程序企圖去修改一個指向一個buffer指針的時候.
九.談?wù)刼bj - c的優(yōu)缺點
優(yōu)點
分類特有語法.可以在不改變原有類的基礎(chǔ)上,增加新的方法.
動態(tài)識別
彈性訊息傳遞
objective -C和C++可混合編程
缺點
不支持命名空間機制:須在其類別名稱加上前綴,時常引致沖突.
不支持運算符重載(所謂重載,就是重新賦予新的含義亭引。例如绎速,大家都已習(xí)慣于用加法運算符”+”對整數(shù)、單精度數(shù)和雙精度數(shù)進行加法運算痛侍,如5+8朝氓,5.8 +3.67等,其實計算機對整數(shù)主届、單精度數(shù)和雙精度數(shù)的加法操作過程是很不相同的赵哲,但由于C++已經(jīng)對運算符”+”進行了重載,所以就能適用于int, float, doUble類型的運算君丁。)
不支持多重繼承
弱語言,很多錯誤發(fā)生在運行時,不方便調(diào)試.
十.堆和棧的區(qū)別
棧:向低地址擴展的數(shù)據(jù)結(jié)構(gòu)枫夺,是一塊連續(xù)的內(nèi)存的區(qū)域。棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的绘闷,從棧獲得的空間較小橡庞。
堆:向高地址擴展的數(shù)據(jù)結(jié)構(gòu)较坛,是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的扒最,自然是不連續(xù)的丑勤,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統(tǒng)中有效的虛擬內(nèi)存吧趣。由此可見法竞,堆獲得的空間比較靈活,也比較大强挫。
碎片問題:對于堆來講岔霸,頻繁的new/delete勢必會造成內(nèi)存空間的不連續(xù),從而造成大量的碎片俯渤,使程序效率降低呆细。對于棧來講,則不會存在這個問題八匠,因為棧是先進后出的隊列絮爷,他們是如此的一一對應(yīng),以至于永遠都不可能有一個內(nèi)存塊從棧中間彈出
分配方式:堆都是動態(tài)分配的臀叙,沒有靜態(tài)分配的堆略水。棧有2種分配方式:靜態(tài)分配和動態(tài)分配价卤。靜態(tài)分配是編譯器完成的劝萤,比如局部變量的分配。動態(tài)分配由alloca函數(shù)進行分配慎璧,但是棧的動態(tài)分配和堆是不同的床嫌,他的動態(tài)分配是由編譯器進行釋放,無需我們手工實現(xiàn)胸私。
分配效率:棧是機器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu)厌处,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行岁疼,這就決定了棧的效率比較高阔涉。堆則是C/C++函數(shù)庫提供的,它的機制是很復(fù)雜的捷绒。
一.運行時你是怎么理解的,怎么用
ObjC Runtime其實是一個Runtime庫瑰排,基本上用C和匯編寫的,這個庫使得C語言有了面向?qū)ο蟮哪芰ε取_@個庫做的事情就是加載類的信息椭住,進行方法的分發(fā)和轉(zhuǎn)發(fā)之類的。OC是一種面向runtime(運行時)的語言字逗,也就是說京郑,它會盡可能地把代碼執(zhí)行的決策從編譯和鏈接的時候推遲到運行時宅广。這給程序員寫代碼帶來很大的靈活性,比如說你可以把消息轉(zhuǎn)發(fā)給你想要的對象些举,或者隨意交換一個方法的實現(xiàn)之類的跟狱。這就要求runtime能檢測一個對象是否能對一個方法進行響應(yīng),然后再把這個方法分發(fā)到對應(yīng)的對象去户魏。我們拿C來跟ObjC對比一下兽肤。在C語言里面,一切從main函數(shù)開始绪抛,程序員寫代碼的時候是自上而下地资铡,一個C的結(jié)構(gòu)體或者說類吧,是不能把方法調(diào)用轉(zhuǎn)發(fā)給其他對象的幢码。這個問題其實涉及到兩個概念笤休,運行時和多態(tài)。簡單來說症副,運行時機制使我們直到運行時才去決定一個對象的類別店雅,以及調(diào)用該類別對象指定方法。多態(tài):不同對象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)贞铣。意思就是假設(shè)生物類(life)都用有一個相同的方法-eat;那人類屬于生物闹啦,豬也屬于生物,都繼承了life后辕坝,實現(xiàn)各自的eat窍奋,但是調(diào)用是我們只需調(diào)用各自的eat方法。也就是不同的對象以自己的方式響應(yīng)了相同的消息響應(yīng)了eat這個選擇器酱畅。因此也可以說琳袄,運行時機制是多態(tài)的基礎(chǔ)。比如KVO中我們就用了纺酸。
二.你單例怎么理解怎么用的?
單例設(shè)計模式,一個類只有一個實例,而且該實例易于外界訪問,方便對實例個數(shù)的控制并節(jié)約系統(tǒng)資源窖逗。類只能有一個實例,而且必須從一個為人熟知的訪問點對其進行訪問餐蔬,比如工廠方法碎紊。在程序中,我需要一系列的對象樊诺,他們每一個內(nèi)部都包含有一組變量和功能仗考,是靜態(tài)的,而且整個程序都只需要擁有一個該類的對象啄骇。例如:
1.登陸界面(點擊多個地方都彈出相同的控制器)痴鳄;
2.管理數(shù)據(jù)庫;
3.音效控制缸夹;
4.文件處理:
5.封裝網(wǎng)絡(luò)工具類等等...
三.說說oc這門語言吧痪寻,和c \ c++比螺句,你覺得哪個效率高,高到哪里了?
object_c比C++稍慢橡类,是因為object_c的一些語言特性蛇尚,比如反射,影響了執(zhí)行效率顾画。區(qū)別主要有以下一些方面取劫。
單一繼承:Objective-C不支持多重繼承,(同Java和Smalltalk)研侣,而C++語言支持多重繼承谱邪。
動態(tài):Objective-C是動態(tài)定型(dynamicaly typed)所以它的類庫比C++要容易操作。Objective-C在運行時可以允許根據(jù)字符串名字來訪問方法和類庶诡,還可以動態(tài)連接和添加類惦银。C++跟從面向?qū)ο缶幊汤锏腟imula67(一種早期OO語言)學(xué)派,而Objecive-C屬于Smalltalk學(xué)派末誓。
在C++里扯俱,對象的靜態(tài)類型決定你是否可以發(fā)送消息給它,而對Objecive-C來說喇澡,由動態(tài)類型來決定迅栅。Simula 67學(xué)派更安全,因為大部分錯誤可以在編譯時查出晴玖。而Smalltalk學(xué)派更靈活读存,比如一些Smalltalk看來無誤的程序拿到Simualr 67那里就無法通過。從很多方面來看窜醉,C++和Objective-C的差別宪萄,與其說時技術(shù)上的,不如說是思維方式上的...
四.代理,通知,KVO各有什么優(yōu)缺點
代理優(yōu)勢:
1.語法嚴格,將要監(jiān)聽的事件必須是delegate協(xié)議中有清晰的定義
2.如果delegate中的一個方法沒有實現(xiàn)那么就會出現(xiàn)編譯警告/錯誤
3.在一個應(yīng)用中的控制流程是可跟蹤的并且是可識別的榨惰;
4.在一個控制器中可以定義定義多個不同的協(xié)議,每個協(xié)議有不同的delegate
5.沒有第三方對象要求保持/監(jiān)視通信過程静汤。
代理缺點
1.需要編寫很多代碼.
定義delegate屬性時,需要注意strong\weak的問題.
3.一般用于父子關(guān)系,層級結(jié)構(gòu)不能太復(fù)雜.
通知優(yōu)點
1.不需要編寫太多代碼,實現(xiàn)比較簡單.
2.對于一個發(fā)出的通知琅催,多個對象能夠做出反應(yīng),即1對多的方式實現(xiàn)簡單.
3.controller能夠傳遞context對象(dictionary)虫给,context對象攜帶了關(guān)于發(fā)送通知的自定義的信息
4.層級結(jié)構(gòu)比較深的時候用.
通知缺點
1.在編譯期不會檢查通知是否能夠被觀察者正確的處理鹿响;
2.在釋放注冊的對象時拆撼,需要在通知中心取消注冊;
3.在調(diào)試的時候應(yīng)用的工作以及控制過程難跟蹤;
4.觀察者需要提前知道通知名稱.
5.通知發(fā)出后易阳,controller不能從觀察者獲得任何的反饋信息。
KVO優(yōu)點
1.能夠提供一種簡單的方法實現(xiàn)兩個對象間的同步。
2.能夠?qū)Ψ俏覀儎?chuàng)建的對象,即內(nèi)部對象的狀態(tài)改變作出響應(yīng).
KVO缺點
1.我們觀察的屬性必須使用strings來定義替饿。因此在編譯器不會出現(xiàn)警告以及檢查;
2.它只能用來對屬性作出反應(yīng)贸典,而不會用來對方法或者動作作出反應(yīng).
3.需要手動移除觀察者视卢。
五.怎么實現(xiàn)在一個線程中同時執(zhí)行兩個任務(wù)?
怎么都做不到
六. BASE64的用法?
BASE64是網(wǎng)絡(luò)傳輸中最常用的編碼格式-用來將二進制的數(shù)據(jù)編碼成字符串的編碼方式.
1>能夠編碼,能夠解碼.
2>被很多的加密算法作為基礎(chǔ)算法.
七.什么是消息推送
可以繞過運營商,通過標(biāo)準TCP/IP網(wǎng)絡(luò)直接向這些手機發(fā)送消息.這些消息就稱為推送消息.推送消息是通過Apple和Google掌控的互聯(lián)網(wǎng)服務(wù)器發(fā)送的.推送消息從根本上就是設(shè)計用于與應(yīng)用程序通信的.它們可以發(fā)送文本,多媒體文件和特定于應(yīng)用程序的數(shù)據(jù),例如警告聲音和顯示在應(yīng)用程序圖標(biāo)上的標(biāo)記等.
八.使用coredate有哪幾種持久化存儲機制
屬性列表
對象歸檔
數(shù)據(jù)庫存儲
九.協(xié)議是什么有什么作用
一系列方法的聲明,某個類遵守了某個協(xié)議就擁有了該協(xié)議的所有方法的聲明.就必須實現(xiàn)協(xié)議中規(guī)定的@require的方法.
十.類變量的@protected, @private,@public, @package聲明各有什么含義
@public本類\子類\在其他類中都能訪問
@protected本類\子類中訪問
@private私有的,只有本類中能訪問
@package本包內(nèi)使用廊驼,跨包不可以.