潭州ios面試題 1

Swift

1> SwiftOC的區(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”

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容