Swift
1> Swift和OC的區(qū)別
1.1> Swift沒(méi)有地址/指針的概念
1.2>?泛型
1.3>?類型嚴(yán)謹(jǐn)對(duì)比oc的動(dòng)態(tài)綁定
2.編譯鏈接
1> id和instancetype的區(qū)別
instancetype只能做返回值,編譯時(shí)判斷真實(shí)類型,不符合發(fā)警告
特殊情況:?關(guān)聯(lián)類型返回方法,如類方法alloc或new開(kāi)頭,實(shí)例方法中,以autorelease,init,retain,或self開(kāi)頭
3: synthesize&dynamic
1:通過(guò)@synthesize?指令告訴編譯器在編譯期間產(chǎn)生getter/setter方法。
?2:?通過(guò)@dynamic指令,自己實(shí)現(xiàn)方法。
有些存取是在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建的,如在CoreData的NSManagedObject類使用的某些。如果你想這些情況下,聲明和使用屬性,但要避免缺少方法在編譯時(shí)的警告,你可以使用@dynamic動(dòng)態(tài)指令,而不是@synthesize合成指令。
4.在項(xiàng)目開(kāi)發(fā)中常用 的開(kāi)發(fā)工具有哪些?有哪些心得?
instrument
beyondCompare?
git
charts
atom
5?UITableView&UICollection
UICollectionView是iOS6新引進(jìn)的API,用于展示集合視圖,布局更加靈活,其用法類似于UITableView。而UICollectionView、UICollectionViewCell與UITableView、UITableViewCell在用法上有相似的也有不同的,下面是一些基本的使用方法:
對(duì)于UITableView,僅需要UITableViewDataSource,UITableViewDelegate這兩個(gè)協(xié)議,使用UICollectionView需要實(shí)現(xiàn)UICollectionViewDataSource, UICollectionViewDelegate,UICollectionViewDelegateFlowLayout這三個(gè)協(xié)議,這是因?yàn)?UICollectionViewDelegateFlowLayout實(shí)際上是UICollectionViewDelegate的一個(gè)子協(xié)議,它繼承 了UICollectionViewDelegate,它的作用是提供一些定義UICollectionView布局模式的函數(shù)
6:NSProxy&NSObject
NSObject協(xié)議組對(duì)所有的Object-C下的objects都生效。?如果objects遵從該協(xié)議,就會(huì)被看作是first-class objects(一級(jí)類)。 另外,遵從該協(xié)議的objects的retain,release,autorelease等方法也服從objects的管理和在Foundation中 定義的釋放方法。一些容器中的對(duì)象也可以管理這些objects,比如說(shuō)NSArray?和NSDictionary定義的對(duì)象。?Cocoa的根類也遵循該協(xié)議,所以所有繼承NSObjects的objects都有遵循該協(xié)議的特性。
NSProxy是一個(gè)虛基類,它為一些表現(xiàn)的像是其它對(duì)象替身或者并不存在的對(duì)象定義一套API。一般的,發(fā)送給代理的消息被轉(zhuǎn)發(fā)給一個(gè)真實(shí)的對(duì)象或者代理本身 load(或者將本身轉(zhuǎn)換成)一個(gè)真實(shí)的對(duì)象。NSProxy的基類可以被用來(lái)透明的轉(zhuǎn)發(fā)消息或者耗費(fèi)巨大的對(duì)象的lazy初始化。?
7 Object&Swift
Obejective-C復(fù)雜的語(yǔ)法,更加簡(jiǎn)單易用、有未來(lái),讓許多開(kāi)發(fā)者心動(dòng)不已,
Swift明顯的特點(diǎn)有:蘋果宣稱Swift?的特點(diǎn)是:快速、現(xiàn)代、安全、互動(dòng),而且明顯優(yōu)于Objective-C?語(yǔ)言 可以使用現(xiàn)有的Cocoa?和Cocoa Touch?框架Swift 取消了?Objective C?的指針及其他不安全訪問(wèn)的使用舍棄Objective C?早期應(yīng)用Smalltalk?的語(yǔ)法,全面改為句點(diǎn)表示法提供了類似Java?的名字空間(namespace)、泛型(generic)、運(yùn)算對(duì)象重載(operator overloading)Swift 被簡(jiǎn)單的形容為 “沒(méi)有 C?的Objective-C”(Objective-C without the C)為蘋果開(kāi)發(fā)工具帶來(lái)了Xcode Playgrounds功能,該功能提供強(qiáng)大的互動(dòng)效果,能讓Swift源代碼在撰寫過(guò)程中實(shí)時(shí)顯示出其運(yùn)行結(jié)果;基于C和Objective-C,而卻沒(méi)有C的一些兼容約束;采用了安全的編程模式;界面基于Cocoa和Cocoa Touch框架;保留了Smalltalk的動(dòng)態(tài)特性
8:傳值通知&推送通知(本地&遠(yuǎn)程)
?8.1 傳值通知:類似通知,代理,Block實(shí)現(xiàn)值得傳遞
?8.2 推送通知:推送到用戶手機(jī)對(duì)應(yīng)的App上(主要是不再前臺(tái)的情況)
?本地通知:
?local notification,用于基于時(shí)間行為的通知,比如有關(guān)日歷或者todo列表的小應(yīng)用。另外,應(yīng)用如果在后臺(tái)執(zhí)行,iOS允許它在受限的時(shí)間內(nèi)運(yùn) 行,它也會(huì)發(fā)現(xiàn)本地通知有用。比如,一個(gè)應(yīng)用,在后臺(tái)運(yùn)行,向應(yīng)用的服務(wù)器端獲取消息,當(dāng)消息到達(dá)時(shí),比如下載更新版本的提示消息,通過(guò)本地通知機(jī)制通知 用戶。 本地通知是UILocalNotification的實(shí)例,主要有三類屬性:
1 scheduled time,時(shí)間周期,用來(lái)指定iOS系統(tǒng)發(fā)送通知的日期和時(shí)間;
2 notification type,通知類型,包括警告信息、動(dòng)作按鈕的標(biāo)題、應(yīng)用圖標(biāo)上的badge(數(shù)字標(biāo)記)和播放的聲音;
3自定義數(shù)據(jù),本地通知可以包含一個(gè)dictionary類型的本地?cái)?shù)據(jù)。
?對(duì)本地通知的數(shù)量限制,iOS最多允許最近本地通知數(shù)量是64個(gè),超過(guò)限制的本地通知將被iOS忽略。
?遠(yuǎn)程通知(需要服務(wù)器):流程大概是這樣的
?1.生成CertificateSigningRequest.certSigningRequest文件
??2.將CertificateSigningRequest.certSigningRequest上傳進(jìn)developer,導(dǎo)出.cer文件
?3.利用CSR導(dǎo)出P12文件
?4.需要準(zhǔn)備下設(shè)備token值(無(wú)空格)
?5.使用OpenSSL合成服務(wù)器所使用的推送證書
一般使用極光推送,步驟是一樣的,只是我們使用的服務(wù)器是極光的,不需要自己大服務(wù)器!
9:imageName和ImageWithContextOfFile的區(qū)別?哪個(gè)性能高
(1)用imageNamed的方式加載時(shí),圖片使用完畢后緩存到內(nèi)存中,內(nèi)存消耗多,加載速度快。即使生成的對(duì)象被?autoReleasePool釋放了,這份緩存也不釋放,如果圖像比較大,或者圖像比較多,用這種方式會(huì)消耗很大的內(nèi)存。imageNamed采用了緩存機(jī)制,如果緩存中已加載了圖片,直接從緩存讀就行了,每次就不用再去讀文件了,效率會(huì)更高。
(2)ImageWithContextOfFile加載,圖片是不會(huì)緩存的,加載速度慢。
(3)大量使用imageNamed方式會(huì)在不需要緩存的地方額外增加開(kāi)銷CPU的時(shí)間.當(dāng)應(yīng)用程序需要加載一張比較大的圖片并且使用一次性,那么其實(shí)是沒(méi)有必要去緩存這個(gè)圖片的,用imageWithContentsOfFile是最為經(jīng)濟(jì)的方式,這樣不會(huì)因?yàn)閁IImage元素較多情況下,CPU會(huì)被逐個(gè)分散在不必要緩存上浪費(fèi)過(guò)多時(shí)間.
10?NSCache&NSDcitionary
NSCache與可變集合有幾點(diǎn)不同
NSCache類結(jié)合了各種自動(dòng)刪除策略,以確保不會(huì)占用過(guò)多的系統(tǒng)內(nèi)存。如果其它應(yīng)用需要內(nèi)存時(shí),系統(tǒng)自動(dòng)執(zhí)行這些策略。當(dāng)調(diào)用這些策略時(shí),會(huì)從緩存中刪除一些對(duì)象,以最大限度減少內(nèi)存的占用。
NSCache是線程安全的,我們可以在不同的線程中添加、刪除和查詢緩存中的對(duì)象,而不需要鎖定緩存區(qū)域。
?不像NSMutableDictionary對(duì)象,一個(gè)緩存對(duì)象不會(huì)拷貝key對(duì)象。NSCache和NSDictionary類似,不同的是系統(tǒng)回收內(nèi)存的時(shí)候它會(huì)自動(dòng)刪掉它的內(nèi)容。
???(1)可以存儲(chǔ)(當(dāng)然是使用內(nèi)存)
???(2)保持強(qiáng)應(yīng)用, 無(wú)視垃圾回收. =>這一點(diǎn)同?NSMutableDictionary
???(3)有固定客戶.
11??UIView的setNeedsDisplay和setNeedsLayout方法
1、在Mac OS中NSWindow的父類是NSResponder,而在i OS 中UIWindow的父類是UIVIew。程序一般只有一個(gè)窗口但是會(huì)又很多視圖。
?2、UIView的作用:描畫和動(dòng)畫,視圖負(fù)責(zé)對(duì)其所屬的矩形區(qū)域描畫、布局和子視圖管理、事件處理、可以接收觸摸事件、事件信息的載體、等等。
?3、UIViewController?負(fù)責(zé)創(chuàng)建其管理的視圖及在低內(nèi)存的時(shí)候?qū)⑺麄儚膬?nèi)存中移除。還為標(biāo)準(zhǔn)的系統(tǒng)行為進(jìn)行響應(yīng)。?
4、layOutSubViews?可以在自己定制的視圖中重載這個(gè)方法,用來(lái)調(diào)整子視圖的尺寸和位置。
5、UIView的setNeedsDisplay(需要重新顯示,繪制)和setNeedsLayout(需要重新布局)方法。首先兩個(gè)方法都是異步執(zhí)行的。而setNeedsDisplay會(huì)調(diào)用自動(dòng)調(diào)用drawRect方法,這樣可以拿到UIGraphicsGetCurrentContext,就可以畫畫了。而setNeedsLayout會(huì)默認(rèn)調(diào)用layoutSubViews,就可以處理子視圖中的一些數(shù)據(jù)。
綜上所述:setNeedsDisplay方便繪圖,而layoutSubViews方便出來(lái)數(shù)據(jù) ? setNeedDisplay告知視圖它發(fā)生了改變,需要重新繪制自身,就相當(dāng)于刷新界面.
12??UILayer&UIView
UIView是iOS系統(tǒng)中界面元素的基礎(chǔ),所有的界面元素都繼承自它。它本身完全是由CoreAnimation來(lái)實(shí)現(xiàn)的(Mac下似乎不是這 樣)。它真正的繪圖部分,是由一個(gè)叫CALayer(Core Animation Layer)的類來(lái)管理。UIView本身,更像是一個(gè)CALayer的管理器,訪問(wèn)它的跟繪圖和跟坐標(biāo)有關(guān)的屬性,例如frame,bounds等等,實(shí)際上內(nèi)部都是在訪問(wèn)它所包含的CALayer的相關(guān)屬性。
UIView有個(gè)重要屬性layer,可以返回它的主CALayer實(shí)例。
UIView的CALayer類似UIView的子View樹形結(jié)構(gòu),也可以向它的layer上添加子layer,來(lái)完成某些特殊的表示。即CALayer層是可以嵌套的。
?UIView的layer樹形在系統(tǒng)內(nèi)部,被維護(hù)著三份copy。分別是邏輯樹,這里是代碼可以操縱的;動(dòng)畫樹,是一個(gè)中間層,系統(tǒng)就在這一層上更改屬性,進(jìn)行各種渲染操作;顯示樹,其內(nèi)容就是當(dāng)前正被顯示在屏幕上得內(nèi)容。
動(dòng)畫的運(yùn)作:對(duì)UIView的subLayer(非主Layer)屬性進(jìn)行更改,系統(tǒng)將自動(dòng)進(jìn)行動(dòng)畫生成,動(dòng)畫持續(xù)時(shí)間的缺省值似乎是0.5秒。
坐標(biāo)系統(tǒng):CALayer的坐標(biāo)系統(tǒng)比UIView多了一個(gè)anchorPoint屬性,使用CGPoint結(jié)構(gòu)表示,值域是0~1,是個(gè)比例值。?
?渲染:當(dāng)更新層,改變不能立即顯示在屏幕上。當(dāng)所有的層都準(zhǔn)備好時(shí),可以調(diào)用setNeedsDisplay方法來(lái)重繪顯示。?
?變換:要在一個(gè)層中添加一個(gè)3D或仿射變換,可以分別設(shè)置層的transform或affineTransform屬性。?
變形:Quartz Core的渲染能力,使二維圖像可以被自由操縱,就好像是三維的。圖像可以在一個(gè)三維坐標(biāo)系中以任意角度被旋轉(zhuǎn),縮放和傾斜。CATransform3D的一套方法提供了一些魔術(shù)般的變換效果。
13 ?layoutSubViews&drawRects
layoutSubviews在以下情況下會(huì)被調(diào)用(視圖位置變化是觸發(fā)):
??1、init初始化不會(huì)觸發(fā)layoutSubviews。
???2、addSubview會(huì)觸發(fā)layoutSubviews。
?3、設(shè)置view的Frame會(huì)觸發(fā)layoutSubviews,當(dāng)然前提是frame的值設(shè)置前后發(fā)生了變化。
?4、滾動(dòng)一個(gè)UIScrollView會(huì)觸發(fā)layoutSubviews。
?5、旋轉(zhuǎn)Screen會(huì)觸發(fā)父UIView上的layoutSubviews事件。
?6、改變一個(gè)UIView大小的時(shí)候也會(huì)觸發(fā)父UIView上的layoutSubviews事件。
?7、直接調(diào)用setLayoutSubviews。
drawRect在以下情況下會(huì)被調(diào)用:
1、如果在UIView初始化時(shí)沒(méi)有設(shè)置rect大小,將直接導(dǎo)致drawRect不被自動(dòng)調(diào)用。drawRect?掉用是在Controller->loadView, Controller->viewDidLoad?兩方法之后掉用的.所以不用擔(dān)心在 控制器中,這些View的drawRect就開(kāi)始畫了.這樣可以在控制器中設(shè)置一些值給View(如果這些View draw的時(shí)候需要用到某些變量 值).
?2、該方法在調(diào)用sizeToFit后被調(diào)用,所以可以先調(diào)用sizeToFit計(jì)算出size。然后系統(tǒng)自動(dòng)調(diào)用drawRect:方法。
?3、通過(guò)設(shè)置contentMode屬性值為UIViewContentModeRedraw。那么將在每次設(shè)置或更改frame的時(shí)候自動(dòng)調(diào)用drawRect:。
?4、直接調(diào)用setNeedsDisplay,或者setNeedsDisplayInRect:觸發(fā)drawRect:,但是有個(gè)前提條件是rect不能為0。
drawRect方法使用注意點(diǎn):
?1、?若使用UIView繪圖,只能在drawRect:方法中獲取相應(yīng)的contextRef并繪圖。如果在其他方法中獲取將獲取到一個(gè)invalidate?的ref并且不能用于畫圖。drawRect:方法不能手動(dòng)顯示調(diào)用,必須通過(guò)調(diào)用setNeedsDisplay?或者?setNeedsDisplayInRect,讓系統(tǒng)自動(dòng)調(diào)該方法。
?2、若使用calayer繪圖,只能在drawInContext:?中(類似魚drawRect)繪制,或者在delegate中的相應(yīng)方法繪制。同樣也是調(diào)用setNeedDisplay等間接調(diào)用以上方法3、若要實(shí)時(shí)畫圖,不能使用gestureRecognizer,只能使用touchbegan等方法來(lái)掉用setNeedsDisplay實(shí)時(shí)刷新屏幕
14?UDID&UUID
?UDID是Unique Device Identifier的縮寫,中文意思是設(shè)備唯一標(biāo)識(shí). 在很多需要限制一臺(tái)設(shè)備一個(gè)賬號(hào)的應(yīng)用中經(jīng)常會(huì)用到,在Symbian時(shí)代,我們是使用IMEI作為設(shè)備的唯一標(biāo)識(shí)的,可惜的是Apple官方不允許開(kāi)發(fā)者獲得設(shè)備的IMEI. ? ? ?[UIDevice currentDevice] uniqueIdentifier]
?但是我們需要注意的一點(diǎn)是,對(duì)于已越獄了的設(shè)備,UDID并不是唯一的.使用Cydia插件UDIDFaker,可以為每一個(gè)應(yīng)用分配不同的UDID.所以UDID作為標(biāo)識(shí)唯一設(shè)備的用途已經(jīng)不大了.
???UUID是Universally Unique Identifier的縮寫,中文意思是通用唯一識(shí)別碼.
?由網(wǎng)上資料顯示,UUID是一個(gè)軟件建構(gòu)的標(biāo)準(zhǔn),也是被開(kāi)源軟件基金會(huì)(Open Software Foundation,OSF)的組織在分布式計(jì)算環(huán)境(Distributed Computing Environment,DCE)領(lǐng)域的一部份.UUID的目的,是讓分布式系統(tǒng)中的所有元素,都能有唯一的辨識(shí)資訊,而不需要透過(guò)中央控制端來(lái)做辨識(shí)資 訊的指定.
15 ?CPU&GPU
?CPU:中央處理器(英文Central Processing Unit)是一臺(tái)計(jì)算機(jī)的運(yùn)算核心和控制核心。CPU、內(nèi)部存儲(chǔ)器和輸入/輸出設(shè)備是電子計(jì)算機(jī)三大核心部件。其功能主要是解釋計(jì)算機(jī)指令以及處理計(jì)算機(jī)軟件中的數(shù)據(jù)。
?GPU:英文全稱Graphic Processing Unit,中文翻譯為“圖形處理器”。一個(gè)專門的圖形核心處理器。GPU是顯示卡的“大腦”,決定了該顯卡的檔次和大部分性能,同時(shí)也是2D顯示卡和3D?顯示卡的區(qū)別依據(jù)。2D顯示芯片在處理3D圖像和特效時(shí)主要依賴CPU的處理能力,稱為“軟加速”。3D顯示芯片是將三維圖像和特效處理功能集中在顯示芯 片內(nèi),也即所謂的“硬件加速”功能。
16?點(diǎn)(pt)&像素(px)
像素(pixels)是數(shù)碼顯示上最小的計(jì)算單位。在同一個(gè)屏幕尺寸,更高的PPI(每英寸的像素?cái)?shù)目),就能顯示更多的像素,同時(shí)渲染的內(nèi)容也會(huì)更清晰。
點(diǎn)(points)是一個(gè)與分辨率無(wú)關(guān)的計(jì)算單位。根據(jù)屏幕的像素密度,一個(gè)點(diǎn)可以包含多個(gè)像素(例如,在標(biāo)準(zhǔn)Retina顯示屏上1 pt里有2 x 2個(gè)像素)。
當(dāng)你為多種顯示設(shè)備設(shè)計(jì)時(shí),你應(yīng)該以“點(diǎn)”為單位作參考,但設(shè)計(jì)還是以像素為單位設(shè)計(jì)的。這意味著仍然需要以3種不同的分辨率導(dǎo)出你的素材,不管你以哪種分辨率設(shè)計(jì)你的應(yīng)用。
17?屬性與成員變量
成員變量是不與外界接觸的變量,應(yīng)用于類的內(nèi)部,如果你說(shuō)那用@Public外部不就是可以訪問(wèn)了么。簡(jiǎn)單的說(shuō)public只能適當(dāng)使用,不要泛濫,否則就像你把鑰匙插在你自己家門上了。誰(shuí)來(lái)都可以開(kāi)門。毫無(wú)安全性。
由于成員變量的私有性,為了解決外部訪問(wèn)的問(wèn)題就有了屬性變量。屬性變量個(gè)人認(rèn)為最大的好處就是讓其他對(duì)象訪問(wèn)這個(gè)變量。而且你可以設(shè)置只讀、可寫等等屬性,同時(shí)設(shè)置的方法我們也可以自己定義。記住一點(diǎn),屬性變量主要是用于與其他對(duì)象相互交互的變量
如果對(duì)于上面所說(shuō)還是含糊不清那就記住這幾點(diǎn)吧!
???1.只有類內(nèi)使用,屬性為private,那么就定義成員變量。
? ?2.如果你發(fā)現(xiàn)你需要的這個(gè)屬性需要是public的,那么毫不猶豫就用屬性在.h中定義。
???3.當(dāng)你自己內(nèi)部需要setter實(shí)現(xiàn)一些功能的時(shí)候,用屬性在.m中定義。
???4.當(dāng)你自己內(nèi)部需要getter實(shí)現(xiàn)一些功能的時(shí)候,用屬性在.m中定義。
18 ?int和NSInteger的區(qū)別
NSInteger表示當(dāng)前cpu下整型所占最大字節(jié),不同CPU的long型所占字節(jié)不同,32位int4 long4,64位int4,long8
19?import和include
import可以避免重復(fù)包含
20 ?@class
避免循環(huán)引用頭文件 向前申明這個(gè)類
21?全局&靜態(tài)變量
1.全局變量和靜態(tài)變量的區(qū)別
1>修飾符
?全局變量在聲明源文件之外使用,需要extern引用一下;
?靜態(tài)變量使用static來(lái)修飾
2>存儲(chǔ)地址
?兩者都是存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū),非堆棧上,它們與局部變量的存儲(chǔ)分開(kāi)
3>生命周期
?兩者都是在程序編譯或加載時(shí)由系統(tǒng)自動(dòng)分配的,程序結(jié)束時(shí)消亡
4>外部可訪問(wèn)性?
?全局變量在整個(gè)程序的任何地方均可訪問(wèn),而靜態(tài)變量相當(dāng)于面向?qū)ο笾械乃接凶兞?他的可訪問(wèn)性只限定于聲明它的那個(gè)源文件,即作用于僅局限于本文件中
22?category
1>?分類 拓展 協(xié)議中哪些可以聲明屬性?
都可以,但分類和協(xié)議創(chuàng)建的屬性只相當(dāng)于方法,但是內(nèi)部沒(méi)有對(duì)成員變量的操作(無(wú)法創(chuàng)建成員變量),拓展可以(私有成員變量)代理中聲明屬性,沒(méi)有實(shí)際創(chuàng)建成員變量,相當(dāng)于聲明了屬性名對(duì)應(yīng)的訪問(wèn)方法,遵守協(xié)議的類需要實(shí)現(xiàn)對(duì)應(yīng)的訪問(wèn)器方法,否則運(yùn)行報(bào)錯(cuò)
分類中聲明屬性,警告提示需要手動(dòng)實(shí)現(xiàn)訪問(wèn)器方法(Swift中叫計(jì)算型屬性),而分類中不能創(chuàng)建成員變量,可以在手寫訪問(wèn)器方法中使用runtime的objc_setAssociatedObject方法關(guān)聯(lián)對(duì)象間接創(chuàng)建屬性(靜態(tài)庫(kù)添加屬性)
拓展里可以聲明屬性,直接可以使用
2>?繼承和類別的區(qū)別
1>?使用繼承:
1.1>?添加新方法和父類方法一致,但父類方法仍需要使用
1.2>?添加新屬性
2>?類別:
2.1>?針對(duì)系統(tǒng)提供的一些類,系統(tǒng)本身不提倡繼承,因?yàn)檫@些類的內(nèi)部實(shí)現(xiàn)對(duì)繼承有所限制(NSString initWithFormat繼承崩潰)
2.2>?類別可以將自己構(gòu)建的類中的方法進(jìn)行分組,對(duì)于大型的類,提高可維護(hù)性
3>?分類的作用
將類的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中。
創(chuàng)建對(duì)私有方法的前向引用。
向?qū)ο筇砑臃钦絽f(xié)議。
(非正式協(xié)議:即NSObject的分類,聲明方法可以不實(shí)現(xiàn),OC2.0以前protocal沒(méi)有@optional,主要使用分類添加可選協(xié)議方法
oc中聲明方法不實(shí)現(xiàn),不調(diào)用則只警告不報(bào)錯(cuò)
正式協(xié)議的優(yōu)點(diǎn):可繼承,泛型約束
如kvo的observeValueForKeyPath屬于nsobject的分類,且不需要調(diào)父類,說(shuō)明可選實(shí)現(xiàn)該方法,沒(méi)警告可能是編譯器規(guī)則過(guò)濾)
4>?分類的局限性
無(wú)法向類中添加新的實(shí)例變量,類別沒(méi)有位置容納實(shí)例變量。
名稱沖突,即當(dāng)類別中的方法與原始類方法名稱沖突時(shí),類別具有更高的優(yōu)先級(jí)。類別方法將完全取代初始方法從而無(wú)法再使用初始方法。
無(wú)法添加實(shí)例變量的局限可以使用字典對(duì)象解決。
2.extension
3.protocol
二: category&extension
類別主要有三個(gè)作用
???(1)可以將類的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中,方便代碼管理。也可以對(duì)框架提供類的擴(kuò)展(沒(méi)有源碼,不能修改)。
???(2)創(chuàng)建對(duì)私有方法的前向引用:如果其他類中的方法未實(shí)現(xiàn),在你訪問(wèn)其他類的私有方法時(shí)編譯器報(bào)錯(cuò)這時(shí)使用類別,在類別中聲明這些方法(不必提供方法實(shí)現(xiàn)),編譯器就不會(huì)再產(chǎn)生警告
???(3)向?qū)ο筇砑臃钦絽f(xié)議:創(chuàng)建一個(gè)NSObject的類別稱為“創(chuàng)建一個(gè)非正式協(xié)議”,因?yàn)榭梢宰鳛槿魏晤惖奈袑?duì)象使用。
?他們的主要區(qū)別是:
?1、形式上來(lái)看,extension是匿名的category。
?2、extension里聲明的方法需要在mainimplementation中實(shí)現(xiàn),category不強(qiáng)制要求。
?3、extension可以添加屬性(變量),category不可以。
??Category和Extension都是用來(lái)給已定義的類增加新的內(nèi)容的。
???Category和原有類的耦合更低一些,聲明和實(shí)現(xiàn)都可以寫在單獨(dú)的文件里。但是只能為已定義類增加Method,而不能加入instance variable。
???Extension耦合比較高,聲明可以單獨(dú)寫,但是實(shí)現(xiàn)必須寫在原有類的@implementation中??梢栽黾覯ethod和instance variable。
???Extension給人感覺(jué)更像是在編寫類時(shí)為了封裝之類的特性而設(shè)計(jì),和類是同時(shí)編寫的。而category則是在用到某一個(gè)framework中的類時(shí)臨時(shí)增加的特性。
???Extension的一個(gè)特性就是可以redeclare一個(gè)instance variable,將之從readonly改為對(duì)內(nèi)readwrite.
?????使用Extension可以更好的封裝類,在h文件中能看到的都是對(duì)外的接口,其余的instance variable和對(duì)內(nèi)的@property等都可以寫在Extension,這樣類的結(jié)構(gòu)更加清晰。
23?nil Nil null NSNull?的區(qū)別
nil 是 ObjC 對(duì)象的字面空值,對(duì)應(yīng) id 類型的對(duì)象,或者使用 @interface 聲明的 ObjC 對(duì)象。
例如:
NSString *someString = nil;
NSURL *someURL = nil;
id someObject = nil;
Nil 是 ObjC 類類型的書面空值,對(duì)應(yīng) Class 類型對(duì)象。
例如:
Class someClass = Nil;
Class anotherClass = [NSString class];
NULL 是任意的 C 指針空值。
例如:
int?*pointerToInt = NULL;
char?*pointerToChar = NULL;
struct?TreeNode *rootNode = NULL;
NSNull 是一個(gè)代表空值的類,是一個(gè) ObjC 對(duì)象。實(shí)際上它只有一個(gè)單例方法:+[NSNull null],一般用于表示集合中值為空的對(duì)象。
例子說(shuō)明:
// 因?yàn)?nil 被用來(lái)用為集合結(jié)束的標(biāo)志,所以 nil 不能存儲(chǔ)在 Foundation 集合里。
NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];
// 錯(cuò)誤的使用
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:nil forKey:@"someKey"];
// 正確的使用
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"someKey"];
24 ?如何避免循環(huán)引用
兩個(gè)對(duì)象相互強(qiáng)引用,都無(wú)法release,解決辦法為一個(gè)使用strong,一個(gè)使用assign(weak)
__weak
25?請(qǐng)簡(jiǎn)要說(shuō)明viewDidLoad和viewDidUnload何時(shí)調(diào)用
答:viewDidLoad在view從nib文件初始化時(shí)調(diào)用,loadView在controller的view為nil時(shí)調(diào)用。此方法在編程實(shí)現(xiàn)view時(shí)調(diào)用,view控制器默認(rèn)會(huì)注冊(cè)memory warning notification,當(dāng)view controller的任何view沒(méi)有用的時(shí)候,viewDidUnload會(huì)被調(diào)用,在這里實(shí)現(xiàn)將retain的view release,如果是retain的IBOutlet view?屬性則不要在這里release,IBOutlet會(huì)負(fù)責(zé)release?。
26?UIWindow
是一種特殊的UIView,通常在一個(gè)程序中只會(huì)有一個(gè)UIWindow,但可以手 動(dòng)創(chuàng)建多個(gè)UIWindow,同時(shí)加到程序里面。UIWindow在程序中主要起到三個(gè)作用:
1、作為容器,包含app所要顯示的所有視圖
2、傳遞觸摸消息到程序中view和其他對(duì)象
3、與UIViewController協(xié)同工作,方便完成設(shè)備方向旋轉(zhuǎn)的支持
27簡(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ū):通過(guò)malloc等函數(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ù)
28.?隊(duì)列和棧有什么區(qū)別
?答:隊(duì)列和棧是兩種不同的數(shù)據(jù)容器。從”數(shù)據(jù)結(jié)構(gòu)”的角度看,它們都是線性結(jié)構(gòu),即數(shù)據(jù)元素之間的關(guān)系相同。
隊(duì)列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),它在兩端進(jìn)行操作,一端進(jìn)行入隊(duì)列操作,一端進(jìn)行出列隊(duì)操作。
棧是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),它只能在棧頂進(jìn)行操作,入棧和出棧都在棧頂操作。
29?簡(jiǎn)述視圖控件器的生命周期。
答:loadView?盡管不直接調(diào)用該方法,如多手動(dòng)創(chuàng)建自己的視圖,那么應(yīng)該覆蓋這個(gè)方法并將它們賦值給試圖控制器的view?屬性。
viewDidUnload?當(dāng)試圖控制器從內(nèi)存釋放自己的方法的時(shí)候調(diào)用,用于清楚那些可能已經(jīng)在試圖控制器中創(chuàng)建的對(duì)象。
viewDidLoad?只有在視圖控制器將其視圖載入到內(nèi)存之后才調(diào)用該方法,這是執(zhí)行任何其他初始化操作的入口。
viewVillAppear?當(dāng)試圖將要添加到窗口中并且還不可見(jiàn)的時(shí)候或者上層視圖移出圖層后本視圖變成頂級(jí)視圖時(shí)調(diào)用該方法,用于執(zhí)行諸如改變視圖方向等的操作。實(shí)現(xiàn)該方法時(shí)確保調(diào)用[super viewWillAppear:]
viewDidAppear?當(dāng)視圖添加到窗口中以后或者上層視圖移出圖層后本視圖變成頂級(jí)視圖時(shí)調(diào)用,用于放置那些需要在視圖顯示后執(zhí)行的代碼。確保調(diào)用[super viewDidAppear:]。
viewWillDisappear-UIViewController對(duì)象的視圖即將消失、被覆蓋或是隱藏時(shí)調(diào)用;
viewDidDisappear-UIViewController對(duì)象的視圖已經(jīng)消失、被覆蓋或是隱藏時(shí)調(diào)用;
viewVillUnload-當(dāng)內(nèi)存過(guò)低時(shí),需要釋放一些不需要使用的視圖時(shí),即將釋放時(shí)調(diào)用;
viewDidUnload-當(dāng)內(nèi)存過(guò)低,釋放一些不需要的視圖時(shí)調(diào)用。
30 app?項(xiàng)目的生命周期?
1>?應(yīng)用的生命周期
各個(gè)程序運(yùn)行狀態(tài)時(shí)代理的回調(diào):
-(BOOL)application:(UIApplication*)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions?告訴代理進(jìn)程啟動(dòng)但還沒(méi)進(jìn)入狀態(tài)保存
-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions?告訴代理啟動(dòng)基本完成程序準(zhǔn)備開(kāi)始運(yùn)行
- (void)applicationWillResignActive:(UIApplication *)application?當(dāng)應(yīng)用程序?qū)⒁敕腔顒?dòng)狀態(tài)執(zhí)行,在此期間,應(yīng)用程序不接收消息或事件,比如來(lái)電話了
- (void)applicationDidBecomeActive:(UIApplication *)application?當(dāng)應(yīng)用程序入活動(dòng)狀態(tài)執(zhí)行,這個(gè)剛好跟上面那個(gè)方法相反
- (void)applicationDidEnterBackground:(UIApplication *)application?當(dāng)程序被推送到后臺(tái)的時(shí)候調(diào)用。所以要設(shè)置后臺(tái)繼續(xù)運(yùn)行,則在這個(gè)函數(shù)里面設(shè)置即可
- (void)applicationWillEnterForeground:(UIApplication *)application?當(dāng)程序從后臺(tái)將要重新回到前臺(tái)時(shí)候調(diào)用,這個(gè)剛好跟上面的那個(gè)方法相反。
- (void)applicationWillTerminate:(UIApplication *)application?當(dāng)程序?qū)⒁顺鍪潜徽{(diào)用,通常是用來(lái)保存數(shù)據(jù)和一些退出前的清理工作。
31簡(jiǎn)要說(shuō)明一下APP的啟動(dòng)過(guò)程,main文件說(shuō)起,main函數(shù)中有什么函數(shù)?作用是什么?
http://www.itdecent.cn/p/3f262ae413b4
打開(kāi)程序——->執(zhí)行main函數(shù)———>UIAPPlicationMain函數(shù)——->初始化UIAPPlicationMain函數(shù)(設(shè)置代理,開(kāi)啟事件循環(huán))———>監(jiān)聽(tīng)系統(tǒng)事件—->程序結(jié)束
先執(zhí)行main函數(shù),main內(nèi)部會(huì)調(diào)用UIApplicationMain函數(shù)
UIApplicationMain函數(shù)作用:
(1)、根據(jù)傳入的第三個(gè)參數(shù)創(chuàng)建UIApplication對(duì)象或它的子類對(duì)象。如果該參數(shù)為nil,直接使用該UIApplication來(lái)創(chuàng)建。(該參數(shù)只能傳人UIApplication或者是它的子類)
(2)、根據(jù)傳入的第四個(gè)參數(shù)創(chuàng)建AppDelegate對(duì)象,并將該對(duì)象賦值給第1步創(chuàng)建的UIApplication對(duì)象的delegate屬性。
(3)、開(kāi)啟一個(gè)事件循環(huán),循環(huán)監(jiān)控應(yīng)用程序發(fā)生的事件。每監(jiān)聽(tīng)到對(duì)應(yīng)的系統(tǒng)事件時(shí),就會(huì)通知AppDelegate。
main函數(shù)作用:
(1)創(chuàng)建UIApplication對(duì)象
(2)創(chuàng)建應(yīng)用程序代理
(3)開(kāi)啟時(shí)間循環(huán),包括應(yīng)用程序的循環(huán)運(yùn)行,并開(kāi)始處理用戶事件。
32動(dòng)畫有基本類型有哪幾種;表視圖有哪幾種基本樣式。
答:動(dòng)畫有兩種基本類型:隱式動(dòng)畫和顯式動(dòng)畫
33??Cocoa Touch提供了哪幾種Core Animation過(guò)渡類型?
Cocoa Touch?提供了4?種Core Animation?過(guò)渡類型,分別為:交叉淡化、推擠、顯示和覆蓋。
34?UIView與CLayer有什么區(qū)別?
1).UIView?是iOS?系統(tǒng)中界面元素的基礎(chǔ),所有的界面元素都是繼承自它。它本身完全是由CoreAnimation?來(lái)實(shí)現(xiàn)的。它真正的繪圖部分,是由一個(gè)CALayer?類來(lái)管理。UIView?本身更像是一個(gè)CALayer?的管理器,訪問(wèn)它的跟繪圖和跟坐標(biāo)有關(guān)的屬性。
2).UIView?有個(gè)重要屬性layer?,可以返回它的主CALayer?實(shí)例。
3).UIView?的CALayer?類似UIView?的子View?樹形結(jié)構(gòu),也可以向它的layer?上添加子layer?,來(lái)完成某些特殊的表示。即CALayer?層是可以嵌套的。
4).UIView?的layer?樹形在系統(tǒng)內(nèi)部,被維護(hù)著三份copy?。分別是邏輯樹,這里是代碼可以操縱的;動(dòng)畫樹,是一個(gè)中間層,系統(tǒng)就在這一層上更改屬性,進(jìn)行各種渲染操作;顯示樹,其內(nèi)容就是當(dāng)前正被顯示在屏幕上得內(nèi)容。
5).動(dòng)畫的運(yùn)作:對(duì)UIView?的subLayer?(非主Layer?)屬性進(jìn)行更改,系統(tǒng)將自動(dòng)進(jìn)行動(dòng)畫生成,動(dòng)畫持續(xù)時(shí)間的缺省值似乎是0.5?秒。
6).坐標(biāo)系統(tǒng):CALayer?的坐標(biāo)系統(tǒng)比UIView?多了一個(gè)anchorPoint?屬性,使用CGPoint?結(jié)構(gòu)表示,值域是0~1?,是個(gè)比例值。這個(gè)點(diǎn)是各種圖形變換的坐標(biāo)原點(diǎn),同時(shí)會(huì)更改layer?的position?的位置,它的缺省值是{0.5,0.5}?,即在layer?的中央。
7).渲染:當(dāng)更新層,改變不能立即顯示在屏幕上。當(dāng)所有的層都準(zhǔn)備好時(shí),可以調(diào)用setNeedsDisplay方法來(lái)重繪顯示。
8).變換:要在一個(gè)層中添加一個(gè)3D?或仿射變換,可以分別設(shè)置層的transform?或affineTransform?屬性。
9).變形:Quartz Core?的渲染能力,使二維圖像可以被自由操縱,就好像是三維的。圖像可以在一個(gè)三維坐標(biāo)系中以任意角度被旋轉(zhuǎn),縮放和傾斜。CATransform3D?的一套方法提供了一些魔術(shù)般的變換效果。
35Quatrz 2D的繪圖功能的三個(gè)核心概念是什么并簡(jiǎn)述其作用。
答:上下文:主要用于描述圖形寫入哪里;
路徑:是在圖層上繪制的內(nèi)容;
狀態(tài):用于保存配置變換的值、填充和輪廓,alpha?值等。
36?iPhone OS主要提供了幾種播放音頻的方法?
SystemSound Services
AVAudioPlayer?類
Audio Queue Services
OpenAL
37?使用AVAudioPlayer類調(diào)用哪個(gè)框架、使用步驟?
?AVFoundation.framework
步驟:配置AVAudioPlayer?對(duì)象;
實(shí)現(xiàn)AVAudioPlayer?類的委托方法;
控制AVAudioPlayer?類的對(duì)象;
監(jiān)控音量水平;
回放進(jìn)度和拖拽播放。
38?有哪幾種手勢(shì)通知方法、寫清楚方法名?
答:
-(void)touchesBegan:(NSSet*)touchedwithEvent:(UIEvent*)event;???????????????????????????????????????????????????????????????????????????????????????
-(void)touchesMoved:(NSSet*)touched withEvent:(UIEvent*)event;??????????????????????????????????????????????????????????????????????????????????????
-(void)touchesEnded:(NSSet*)touchedwithEvent:(UIEvent*)event;???????????????????????????????????????
-(void)touchesCanceled:(NSSet*)touchedwithEvent:(UIEvent*)event;
-(void)touchesBegan:(NSSet*)touchedwithEvent:(UIEvent*)event;????????????????????????????????????????????????????????????????????????????????????
-(void)touchesMoved:(NSSet*)touched withEvent:(UIEvent*)event;??????????????????????????????????????????????????????????????????????????????????
-(void)touchesEnded:(NSSet*)touchedwithEvent:(UIEvent*)event;??????????????????????????????????????????????????????????????????????????????????
-(void)touchesCanceled:(NSSet*)touchedwithEvent:(UIEvent*)event;
39.什么時(shí)候用delegate,什么時(shí)候用Notification?
答: delegate針對(duì)one-to-one關(guān)系,用于sender接受到reciever的某個(gè)功能反饋值。
notification針對(duì)one-to-one/many/none,reciver,用于通知多個(gè)object某個(gè)事件。
40?用預(yù)處理指令#define聲明一個(gè)常數(shù),用以表明1年中有多少秒(忽略閏年問(wèn)題)
?#define SECONDS_PER_YEAR ?(60 * 60 * 24 * 365)UL
我在這想看到幾件事情:
#define?語(yǔ)法的基本知識(shí)(例如:不能以分號(hào)結(jié)束,括號(hào)的使用,等等)
懂得預(yù)處理器將為你計(jì)算常數(shù)表達(dá)式的值,因此,直接寫出你是如何計(jì)算一年中有多少
秒而不是計(jì)算出實(shí)際的值,是更清晰而沒(méi)有代價(jià)的。
意識(shí)到這個(gè)表達(dá)式將使一個(gè)16位機(jī)的整型數(shù)溢出-因此要用到長(zhǎng)整型符號(hào)L,告訴編譯器這個(gè)常數(shù)是的長(zhǎng)整型數(shù)。
如果你在你的表達(dá)式中用到UL(表示無(wú)符號(hào)長(zhǎng)整型),那么你有了一個(gè)好的起點(diǎn)。記住,第一印象很重要。
41?寫一個(gè)”標(biāo)準(zhǔn)"宏MIN?,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。
#define MIN(A,B)?((A)<= (B) ? (A) : (B))
標(biāo)識(shí)#define在宏中應(yīng)用的基本知識(shí)。這是很重要的,因?yàn)橹钡角度?inline)操作符變?yōu)闃?biāo)準(zhǔn)C的一部分,宏是方便產(chǎn)生嵌入代碼的唯一方法,
對(duì)于嵌入式系統(tǒng)來(lái)說(shuō),為了能達(dá)到要求的性能,嵌入代碼經(jīng)常是必須的方法。
三重條件操作符的知識(shí)。這個(gè)操作符存在C語(yǔ)言中的原因是它使得編譯器能產(chǎn)生比if-then-else?更優(yōu)化的代碼,了解這個(gè)用法是很重要的。
懂得在宏中小心地把參數(shù)用括號(hào)括起來(lái)
我也用這個(gè)問(wèn)題開(kāi)始討論宏的副作用,例如:當(dāng)你寫下面的代碼時(shí)會(huì)發(fā)生什么事?
least = MIN(*p++, b);
least = MIN(*p++, b);
結(jié)果是:
((*p++) <= (b) ? (*p++) : (*p++))
((*p++) <= (b) ? (*p++) : (*p++))
這個(gè)表達(dá)式會(huì)產(chǎn)生副作用,指針p會(huì)作三次++自增操作。
42關(guān)鍵字const有什么含意?修飾類呢?static的作用,用于類呢?還有extern c的作用
答:const?意味著"只讀",下面的聲明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前兩個(gè)的作用是一樣,a是一個(gè)常整型數(shù)。
第三個(gè)意味著a是一個(gè)指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。
第四個(gè)意思a是一個(gè)指向整型數(shù)的常指針(也就是說(shuō),指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。
最后一個(gè)意味著a是一個(gè)指向常整型數(shù)的常指針(也就是說(shuō),指針指向的整型數(shù)是不可修改的,同時(shí)指針也是不可修改的)。
結(jié)論:
關(guān)鍵字const的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實(shí)際上,聲明一個(gè)參數(shù)為常量是為了告訴了用戶這個(gè)參數(shù)的應(yīng)用目的。
如果你曾花很多時(shí)間清理其它人留下的垃圾,你就會(huì)很快學(xué)會(huì)感謝這點(diǎn)多余的信息。(當(dāng)然,懂得用const的程序員很少會(huì)留下的垃圾讓別人來(lái)清理的)?通過(guò)給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼。合理地使用關(guān)鍵字const可以使編譯器很自然地保護(hù)那些不希望被改變的參數(shù),防止其被無(wú)意的代碼修改。簡(jiǎn)而言之,這樣可以減少bug的出現(xiàn)。
1).欲阻止一個(gè)變量被改變,可以使用const?關(guān)鍵字。在定義該const?變量時(shí),通常需要對(duì)它進(jìn)行初始化,因?yàn)橐院缶蜎](méi)有機(jī)會(huì)再去改變它了;
2).對(duì)指針來(lái)說(shuō),可以指定指針本身為const,也可以指定指針?biāo)傅臄?shù)據(jù)為const,或二者同時(shí)指定為const;
3).在一個(gè)函數(shù)聲明中,const可以修飾形參,表明它是一個(gè)輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值;
4).對(duì)于類的成員函數(shù),若指定其為const?類型,則表明其是一個(gè)常函數(shù),不能修改類的成員變量;
5).對(duì)于類的成員函數(shù),有時(shí)候必須指定其返回值為const?類型,以使得其返回值不為“左值”。
43?static?關(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ù)的使用范圍被限制在聲明它的模塊內(nèi);
4).在類中的static?成員變量屬于整個(gè)類所擁有,對(duì)類的所有對(duì)象只有一份拷貝;
5).在類中的static?成員函數(shù)屬于整個(gè)類所擁有,這個(gè)函數(shù)不接收this?指針,因而只能訪問(wèn)類的static?成員變量。
44.?列舉幾種進(jìn)程的同步機(jī)制,并比較其優(yōu)缺點(diǎn)。
答:原子操作?信號(hào)量機(jī)制???自旋鎖???管程,會(huì)合,分布式系統(tǒng)
45?進(jìn)程之間通信的途徑
共享存儲(chǔ)系統(tǒng)消息傳遞系統(tǒng)管道:以文件系統(tǒng)為基礎(chǔ)
46進(jìn)程死鎖的原因
資源競(jìng)爭(zhēng)及進(jìn)程推進(jìn)順序非法
47.?死鎖的4個(gè)必要條件
答:互斥、請(qǐng)求保持、不可剝奪、環(huán)路
48?死鎖的處理
答:鴕鳥策略、預(yù)防策略、避免策略、檢測(cè)與解除死鎖
49?. cocoa touch框架
答:iPhone OS?應(yīng)用程序的基礎(chǔ)Cocoa Touch?框架重用了許多Mac?系統(tǒng)的成熟模式,但是它更多地專注于觸摸的接口和優(yōu)化。
UIKit?為您提供了在iPhone OS?上實(shí)現(xiàn)圖形,事件驅(qū)動(dòng)程序的基本工具,其建立在和Mac OS X?中一樣的Foundation?框架上,包括文件處理,網(wǎng)絡(luò),字符串操作等。
Cocoa Touch?具有和iPhone?用戶接口一致的特殊設(shè)計(jì)。有了UIKit,您可以使用iPhone OS?上的獨(dú)特的圖形接口控件,按鈕,以及全屏視圖的功能,您還可以使用加速儀和多點(diǎn)觸摸手勢(shì)來(lái)控制您的應(yīng)用。
各色俱全的框架除了UIKit?外,Cocoa Touch?包含了創(chuàng)建世界一流iPhone?應(yīng)用程序需要的所有框架,從三維圖形,到專業(yè)音效,甚至提供設(shè)備訪問(wèn)API?以控制攝像頭,或通過(guò)GPS?獲知當(dāng)前位置。
Cocoa Touch?既包含只需要幾行代碼就可以完成全部任務(wù)的強(qiáng)大的Objective-C?框架,也在需要時(shí)提供基礎(chǔ)的C?語(yǔ)言API?來(lái)直接訪問(wèn)系統(tǒng)。這些框架包括:
Core Animation:通過(guò)Core Animation,您就可以通過(guò)一個(gè)基于組合獨(dú)立圖層的簡(jiǎn)單的編程模型來(lái)創(chuàng)建豐富的用戶體驗(yàn)。
Core Audio:Core Audio?是播放,處理和錄制音頻的專業(yè)技術(shù),能夠輕松為您的應(yīng)用程序添加強(qiáng)大的音頻功能。
Core Data:提供了一個(gè)面向?qū)ο蟮臄?shù)據(jù)管理解決方案,它易于使用和理解,甚至可處理任何應(yīng)用或大或小的數(shù)據(jù)模型。
功能列表:框架分類
下面是Cocoa Touch?中一小部分可用的框架:
音頻和視頻:Core Audio?,OpenAL?,Media Library?,AV Foundation
數(shù)據(jù)管理:Core Data?,SQLite
圖形和動(dòng)畫:Core Animation?,OpenGL ES?,Quartz 2D
網(wǎng)絡(luò):Bonjour,WebKit?,BSD Sockets
用戶應(yīng)用:Address Book?,Core Location?,Map Kit?,Store Kit
50?自動(dòng)釋放池是什么,如何工作
答:當(dāng)您向一個(gè)對(duì)象發(fā)送一個(gè)autorelease消息時(shí),Cocoa就會(huì)將該對(duì)象的一個(gè)引用放入到最新的自動(dòng)釋放.它仍然是個(gè)正當(dāng)?shù)膶?duì)象,因此自動(dòng)釋放池定義的作用域內(nèi)的其它對(duì)象可以向它發(fā)送消息。當(dāng)程序執(zhí)行到作用域結(jié)束的位置時(shí)(其實(shí)是一個(gè)runloop結(jié)束的時(shí)候),自動(dòng)釋放池就會(huì)被釋放,池中的所有對(duì)象也就被釋放。
51?sprintf,strcpy,memcpy使用上有什么要注意的地方
1). sprintf是格式化函數(shù)。將一段數(shù)據(jù)通過(guò)特定的格式,格式化到一個(gè)字符串緩沖區(qū)中去。sprintf格式化的函數(shù)的長(zhǎng)度不可控,有可能格式化后的字符串會(huì)超出緩沖區(qū)的大小,造成溢出。
2).strcpy是一個(gè)字符串拷貝的函數(shù),它的函數(shù)原型為strcpy(char *dst, const char *src
將src開(kāi)始的一段字符串拷貝到dst開(kāi)始的內(nèi)存中去,結(jié)束的標(biāo)志符號(hào)為‘\0',由于拷貝的長(zhǎng)度不是由我們自己控制的,所以這個(gè)字符串拷貝很容易出錯(cuò)。
3). memcpy是具備字符串拷貝功能的函數(shù),這是一個(gè)內(nèi)存拷貝函數(shù),它的函數(shù)原型為memcpy(char *dst, const char* src, unsigned int len);將長(zhǎng)度為len的一段內(nèi)存,從src拷貝到dst中去,這個(gè)函數(shù)的長(zhǎng)度可控。但是會(huì)有內(nèi)存疊加的問(wèn)題。
52.?你了解svn,cvs等版本控制工具么?
答:版本控制svn,cvs?是兩種版控制的器,需要配套相關(guān)的svn,cvs服務(wù)器。
scm是xcode里配置版本控制的地方。版本控制的原理就是a和b同時(shí)開(kāi)發(fā)一個(gè)項(xiàng)目,a寫完當(dāng)天的代碼之后把代碼提交給服務(wù)器,b要做的時(shí)候先從服務(wù)器得到最新版本,就可以接著做。如果a和b都要提交給服務(wù)器,并且同時(shí)修改了同一個(gè)方法,就會(huì)產(chǎn)生代碼沖突,如果a先提交,那么b提交時(shí),服務(wù)器可以提示沖突的代碼,b可以清晰的看到,并做出相應(yīng)的修改或融合后再提交到服務(wù)器。
53??什么是push。
答:客戶端程序留下后門端口,客戶端總是監(jiān)聽(tīng)針對(duì)這個(gè)后門的請(qǐng)求,于是服務(wù)器可以主動(dòng)像這個(gè)端口推送消息。
54?靜態(tài)鏈接庫(kù)
答:此為.a文件,相當(dāng)于java里的jar包,把一些類編譯到一個(gè)包中,在不同的工程中如果導(dǎo)入此文件就可以使用里面的類,具體使用依然是#import “ xx.h”