delegate和notification區別,分別在什麼狀況下使用?java
Delegate:linux
消息的發送者(sender)告知接收者(receiver)某個事件將要發生,delegate贊成然而後發送者響應事件,delegate機制使得接收者能夠改變發送者的行爲。一般發送者和接收者的關係是直接的一對一的關係。ios
Notification:c++
消息的發送者告知接收者事件已經發生或者將要發送,僅此而已,接收者並不能反過來影響發送者的行爲。一般發送者和接收者的關係是間接的一對多或者多對多關係。程序員
總結:三點web
1.兩者都用於傳遞消息,不一樣之處主要在於一個是一對一的,另外一個是一對多或者多對多的。sql
2.delegate須要二者之間必須創建聯繫,否則無法調用代理的方法;notification不須要二者之間有聯繫,notification經過維護一個array,實現一對多消息的轉發。兩個模塊之間聯繫不是很緊密,就用notification傳值,例如多線程之間傳值用notificaiton。delegate只是一種較爲簡單的回調,且主要用在一個模塊中,例如底層功能完成了,須要把一些值傳到上層去,就事先把上層的函數經過delegate傳到底層,而後在底層call這個delegate,它們都在一個模塊中,完成一個功能,例如說 NavgationController 從 B 界面到A 點返回按鈕 (調用popViewController方法) 能夠用delegate比較好。數據庫
3. 效率確定是delegate比nsnotification高。編程
4. delegate方法比notification更加直接,最典型的特徵是,delegate方法每每須要關注返回值,也就是delegate方法的結果。好比-windowShouldClose:,須要關心返回的是yes仍是no。,根據返回值來決定如何作下一步.因此delegate方法每每包含should這個很傳神的詞。相反的,notification最大的特點就是不關心接受者的態度,我只管把通告放出來,你接受不接受就是你的事情,同時我也不關心結果。因此notification每每用did這個詞彙,好比NSWindowDidResizeNotification,那麼nswindow對象放出這個notification後就什麼都無論了也不會等待接受者的反應。設計模式
3六、你是如何理解delegate?
delegate,又稱爲委託或者代理,它是一種設計模式,delegate主要用於兩個對象之間的通訊交互,而且解除兩個通訊對象的耦合性,IOS中大量使用了delegate設計,主要用於視圖與適用對象之間的通訊交互。
delegate notification kvo三者比較
三種模式都是一個對象傳遞事件給另一個對象,而且不要他們有耦合。三種模式都是對象來通知某個事件發生了的方法,或者更準確的說,是容許其餘的對象收到這種事件的方法。
delegation
delegation的基本特徵是,一個controller定義了一個協議(即一系列的方法定義)。該協議描述了一個delegate對象爲了可以響應一個controller的事件而必須作的事情。協議就是delegator說,「若是你想做爲個人delegate,那麼你就必須實現這些方法」。實現這些方法就是容許controller在它的delegate可以調用這些方法,而它的delegate知道何時調用哪一種方法。delegate能夠是任何一種對象類型,所以controller不會與某種對象進行耦合,可是當該對象嘗試告訴委託事情時,該對象能肯定delegate將響應。
delegate的優點:
1.很是嚴格的語法。全部將聽到的事件必須是在delegate協議中有清晰的定義。
2.若是delegate中的一個方法沒有實現那麼就會出現編譯警告/錯誤
3.協議必須在controller的做用域範圍內定義
4.在一個應用中的控制流程是可跟蹤的而且是可識別的;
5.在一個控制器中能夠定義定義多個不一樣的協議,每一個協議有不一樣的delegates
6.沒有第三方對象要求保持/監視通訊過程。
7.可以接收調用的協議方法的返回值。這意味着delegate可以提供反饋信息給controller
缺點:
1.須要定義不少代碼:1).協議定義;2).controller的delegate屬性;3).在delegate自己中實現delegate方法定義
2.在釋放代理對象時,須要當心的將delegate改成nil。一旦設定失敗,那麼調用釋放對象的方法將會出現內存crash
3.在一個controller中有多個delegate對象,而且delegate是遵照同一個協議,但仍是很難告訴多個對象同一個事件,不過有可能。
notification
IOS應用開發中有一個」Notification Center「的概念。它是一個單例對象,容許當事件發生時通知一些對象。它容許咱們在低程度耦合的狀況下,知足控制器與一個任意的對象進行通訊的目的。這種模式的基本特徵是爲了讓其餘的對象可以接收到在該controller中發生某種事件而產生的消息,controller用一個key(通知名稱)。這樣對於controller來講是匿名的,其餘的使用一樣的key來註冊了該通知的對象(即觀察者)可以對通知的事件做出反應。
優點
1.不須要編寫多少代碼,實現比較簡單;
2.對於一個發出的通知,多個對象可以作出反應,即1對多的方式實現簡單
3.controller可以傳遞context對象(dictionary),context對象攜帶了關於發送通知的自定義的信息
缺點:
1.在編譯期不會檢查通知是否可以被觀察者正確的處理;
2.在釋放註冊的對象時,須要在通知中心取消註冊;
3.在調試的時候應用的工做以及控制過程難跟蹤;
4.須要第三方對喜好那個來管理controller與觀察者對象之間的聯繫;
5.controller和觀察者須要提早知道通知名稱、UserInfo dictionary keys。若是這些沒有在工做區間定義,那麼會出現不一樣步的狀況;
6.通知發出後,controller不能從觀察者得到任何的反饋信息。
KVO
KVO是一個對象可以觀察另一個對象的屬性的值,而且可以發現值的變化。前面兩種模式更加適合一個controller與任何其餘的對象進行通訊,而KVO更加適合任何類型的對象偵聽另一個任意對象的改變(這裏也能夠是controller,但通常不是controller)。這是一個對象與另一個對象保持同步的一種方法,即當另一種對象的狀態發生改變時,觀察對象立刻做出反應。它只能用來對屬性做出反應,而不會用來對方法或者動做做出反應。
優勢
1.可以提供一種簡單的方法實現兩個對象間的同步。例如:model和view之間同步;
2.可以對非咱們建立的對象,即內部對象的狀態改變做出響應,並且不須要改變內部對象(SKD對象)的實現;
3.可以提供觀察的屬性的最新值以及先前值;
4.用key paths來觀察屬性,所以也能夠觀察嵌套對象;
5.完成了對觀察對象的抽象,由於不須要額外的代碼來容許觀察值可以被觀察
缺點:
1.咱們觀察的屬性必須使用strings來定義。所以在編譯器不會出現警告以及檢查;
2.對屬性重構將致使咱們的觀察代碼再也不可用;
3.複雜的「IF」語句要求對象正在觀察多個值。這是由於全部的觀察代碼經過一個方法來指向;
4.當釋放觀察者時不須要移除觀察者。
使用任何一種模式都沒有對和錯,只有更適合或者不適合。每一種模式都給對象提供一種方法來通知一個事件給其餘對象,並且前者不須要知道偵聽者。在這三種模式中,我認爲KVO有最清晰的使用案例,並且針對某個需求有清晰的實用性。而另外兩種模式有比較類似的用處,而且常常用來給controller間進行通訊。
使用命名規則好的協議和協議方法定義對於清晰的理解controllers間的通訊是很容易的。努力的定義這些協議方法將加強代碼的可讀性,以及更好的跟蹤你的app。代理協議發生改變以及實現均可經過編譯器檢查出來,若是沒有將會在開發的過程當中至少會出現crash,而不只僅是讓一些事情異常工做。甚至在同一事件通知多控制器的場景中,只要你的應用在controller層次有着良好的結構,消息將在該層次上傳遞。該層次可以向後傳遞直至讓全部須要知道事件的controllers都知道。固然會有delegation模式不適合的例外狀況出現,並且notification可能更加有效。例如:應用中全部的controller須要知道一個事件。然而這些類型的場景不多出現。另一個例子是當你創建了一個架構並且須要通知該事件給正在運行中應用。
1 使用block和使用delegate完成委託模式有什麼優勢?
首先要了解什麼是委託模式,委託模式在iOS中大量應用,其在設計模式中是適配器模式中的對象適配器,Objective-C中使用id類型指向一切對象,使委託模式更爲簡潔。瞭解委託模式的細節:
iOS設計模式—-委託模式
使用block實現委託模式,其優勢是回調的block代碼塊定義在委託對象函數內部,使代碼更爲緊湊;
適配對象再也不須要實現具體某個protocol,代碼更爲簡潔。
七、block與函數有何異同,block有何優勢
1>block相似於c裏面的函數指針,均可以做爲參數進行傳遞,用於回調,但block的定義能夠在方法中,函數則不能夠。
2>block語法簡潔,能夠在方法中定義實現,這樣能夠訪問方法中的局部變量,使代碼更加緊靠,結構簡化。
1三、Block在內存管理上的特色,須要注意循環引用,如何解決循環引用
1>、block塊中使用了局部對象,則會將此對象retain,引用了當前對象的屬性或者方法,則會將當前對象retain
2>、解決循環引用:將當前對象賦給一個局部變量,而且使用__block關鍵字修飾局部變量,使用該變量訪問對象的屬性和方法
2 多線程與block
GCD與Block
使用 dispatch_async 系列方法,能夠以指定的方式執行block
GCD編程實例
dispatch_async的完整定義
void dispatch_async(
dispatch_queue_t queue,
dispatch_block_t block);
功能:在指定的隊列裏提交一個異步執行的block,不阻塞當前線程
經過queue來控制block執行的線程。主線程執行前文定義的 finishBlock對象 dispatch_async(dispatch_get_main_queue(),^(void){finishBlock();});
__block和__weak修飾符的區別實際上是挺明顯的:
1.__block無論是ARC仍是MRC模式下均可以使用,能夠修飾對象,還能夠修飾基本數據類型。
2.__weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數據類型(int)。
3.__block對象能夠在block中被從新賦值,__weak不能夠。
tableView 滑動卡的問題主要是由於:從緩存中或者是從本地讀取圖片給UIImage的時候耗費的時間。須要把下面的兩句話放到子線程裏面:
把UIImage賦值給圖片的時候在主線程。
子線程不能更新UI 全部的UI跟新都是主線程執行了。手指滑動屏幕了。或者屏幕的某個方法執行了。
子線程裏面加入NSTimer 的時候須要 手動添加NSRunloop 不然不能循環。
單利裏面添加 NSMutableArray 的時候,防止多個地方對它同時便利和修改的話,須要加原子屬性。而且用strong,,,而且寫一個遍歷和修改的方法。加上鎖。 Lock UnLock
__weak ViewController* weakSelf = self;
GCD裏面用 __weak 防止內存釋放不了,循環引用。
UIViewController的生命週期
答:當一個視圖控制器被建立,並在屏幕上顯示的時候。 代碼的執行順序
// 視圖顯示在屏幕上的順序
一、 alloc 建立對象,分配空間。
二、init (initWithNibName) 初始化對象,初始化數據。
三、loadView 從nib載入視圖, 這一步不須要去幹涉。除非沒有使用xib文件建立視圖。
四、viewDidLoad 加載完畢,能夠進行自定義數據以及動態建立其餘控件。
五、viewWillAppear 視圖將出如今屏幕以前,立刻這個視圖即將顯示在屏幕上。
六、viewDidAppear 視圖已在屏幕上渲染完成。
// 視圖將被從屏幕上移除的順序
一、viewWillDisappear 視圖將被從屏幕上移除以前執行。
二、viewDidDisappear 視圖已經被從屏幕上移除。
三、dealloc 視圖被銷燬,此時須要在init和viewDidLoad中建立的對象進行釋放。
四、viewDidUnload 出現內存警告在內存不足時執行,並對全部非當前顯示的controller執行。
本視圖的全部子視圖將被銷燬,以釋放內存,此時開發者須要手動對viewLoad、viewDidLoad中建立的對象釋放內存。
由於當這個視圖再次顯示在屏幕上的時候,viewLoad、viewDidLoad 再次被調用,以便再次構造視圖
16.屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什麼做用,在那種狀況下用?
答:readwrite 是可讀可寫特性;須要生成getter方法和setter方法時
readonly 是隻讀特性 只會生成getter方法 不會生成setter方法 ;不但願屬性在類外改變
assign 是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時;
retain 表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1;
copy 表示賦值特性,setter方法將傳入對象複製一份;須要徹底一份新的變量時。
nonatomic 非原子操做,決定編譯器生成的setter getter是不是原子操做,atomic表示多線程安全,通常使用non
十一、strong 與weak,_unsafe_unretained與weak的區別
1>strong叫強引用,weak叫弱引用,在ARC中,使用strong告訴編譯器幫助咱們自動插入retain,weak是普通賦值至關於手動管理內存的assign;
2>_unsafe_unretained與weak功能一致,區別在於當指向的對象銷燬後,weak會將變量置爲nil,防止調用野指針。
1.什麼狀況使用 weak 關鍵字,相比 assign 有什麼不一樣?
什麼狀況使用 weak 關鍵字?
1)在ARC中,在有可能出現循環引用的時候,每每要經過讓其中一端使用weak來解決,好比:delegate代理屬性
2)自身已經對它進行一次強引用,沒有必要再強引用一次,此時也會使用weak,自定義IBOutlet控件屬性通常也使用weak;固然,也能夠使用strong。
不一樣點:
1)weak 此特質代表該屬性定義了一種「非擁有關係」 (nonowning relationship)。爲這種屬性設置新值時,設置方法既不保留新值,也不釋放舊值。此特質同assign相似, 然而在屬性所指的對象遭到摧毀時,屬性值也會清空(nil out)。 而 assign 的「設置方法」只會執行鍼對「純量類型」 (scalar type,例如 CGFloat 或 NSlnteger 等)的簡單賦值操做。
2)assigin 能夠用非OC對象,而weak必須用於OC對象
2.這個寫法會出什麼問題: @property (strong) NSMutableArray *array;
使用了atomic屬性會嚴重影響性能。
該屬性使用了同步鎖,會在建立時生成一些額外的代碼用於幫助編寫多線程程序,這會帶來性能問題,經過聲明nonatomic能夠節省這些雖然很小可是沒必要要額外開銷。
在默認狀況下,由編譯器所合成的方法會經過鎖定機制確保其原子性(atomicity)。若是屬性具有nonatomic特質,則不使用同步鎖。請注意,儘管沒有名爲「atomic」的特質(若是某屬性不具有nonatomic特質,那它就是「原子的」(atomic))。
在iOS開發中,你會發現,幾乎全部屬性都聲明爲nonatomic。
通常狀況下並不要求屬性必須是「原子的」,由於這並不能保證「線程安全」 ( thread safety),若要實現「線程安全」的操做,還需採用更爲深層的鎖定機制才行。例如,一個線程在連續屢次讀取某屬性值的過程當中有別的線程在同時改寫該值,那麼即使將屬性聲明爲atomic,也仍是會讀到不一樣的屬性值。
所以,開發iOS程序時通常都會使用nonatomic屬性。可是在開發Mac OS X程序時,使用 atomic屬性一般都不會有性能瓶頸。
17.如何對iOS設備進行性能測試?
答:Profile-> Instruments ->Time Profiler
1六、iOS開發中數據持久性,有哪幾種?
plist文件寫入、對象歸檔、sqlite3數據庫、core data
1八、簡述常見的設計模式?
單例設計、代理設計、觀察者(通知)、工廠方法、模版方法
2四、@synthesize與dynamic的區別
1>@synthesize是系統自動生成getter和setter屬性聲明
2>@danamic的意思是告訴編譯器,屬性的獲取與賦值方法由用戶本身實現,不自動生成
20.Object C中建立線程的方法是什麼?若是在主線程中執行代碼,方法是什麼?若是想延時執行代碼、方法又是什麼?
答:線程建立有三種方法:使用NSThread建立、使用 GCD的dispatch、使用子類化的NSOperation,而後將其加入NSOperationQueue;在主線程執行代碼,方法是 performSelectorOnMainThread,若是想延時執行代碼能夠用performSelector:onThread:withObject:waitUntilDone:
24.淺複製和深複製的區別?//淺拷貝和深拷貝
答案:
淺層複製(copy):只複製指向對象的指針,而不復制引用對象自己。//經過對象的指針來訪問這個對象深層複製(mutableCopy):複製引用對象自己意思就是有個A對象,複製一份後獲得A_copy對象後,對於淺複製來講,A和A_copy指向的是同一個內存資源,複製的只不過是是一個指針,對象自己資源仍是隻有一份,那若是咱們對A_copy執行了修改操做,那麼發現A引用的對象一樣被修改,這其實違背了咱們複製拷貝的一個思想。深複製就好理解了,內存中存在了兩份獨立對象自己。//當修改A時,A copy不變。
27.類別的做用?繼承和類別在實現中有何區別?
答:category 能夠在不獲悉,不改變原來代碼的狀況下往裏面添加新的方法,只能添加,不能刪除修改。
而且若是類別和原來類中的方法產生名稱衝突,則類別將覆蓋原來的方法,由於類別具備更高的優先級。類別主要有3個做用:
(1)將類的實現分散到多個不一樣文件或多個不一樣框架中。
(2)建立對私有方法的前向引用。
(3)向對象添加非正式協議。
繼承能夠增長,修改或者刪除方法,而且能夠增長屬性
28.類別和類擴展的區別。
答:category和extensions的不一樣在於 後者能夠添加屬性。另外後者添加的方法是必需要實現的。extensions能夠認爲是一個私有的Category
29.KVO and KVC?
答:kvc:鍵 - 值編碼是一種間接訪問對象的屬性,使用字符串來標識屬性,而不是經過調用存取方法,直接或經過實例變量訪問的機制。不少狀況下能夠簡化程序代碼。apple文檔其實給了一個很好的例子。kvo:鍵值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。具體用看到用到過的一個地方是對於按鈕點擊變化狀態的的監控。好比我自定義的一個button[cpp]
[self addObserver:self forKeyPath:@"highlighted" options:0 context:nil]; #pragma mark KVO
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"highlighted"] ) {
[self setNeedsDisplay];
}
}
對於系統是根據keypath去取的到相應的值發生改變,理論上來講是和kvc機制的道理是同樣的。對於kvc機制如何經過key尋找到value:「當經過KVC調用對象時,好比:[self valueForKey:@」someKey」]時,程序會自動試圖經過幾種不一樣的方式解析這個調用。首先查找對象是否帶有 someKey 這個方法,若是沒找到,會繼續查找對象是否帶有someKey這個實例變量(iVar),若是尚未找到,程序會繼續試圖調用
-(id) valueForUndefinedKey:這個方法。若是這個方法仍是沒有被實現的話,程序會拋出一個NSUndefinedKeyException異常錯誤。(cocoachina.com注:Key-Value Coding查找方法的時候,不只僅會查找someKey這個方法,還會查找getsomeKey這個方法,前面加一個get,或者_someKey以及_getsomeKey這幾種形式。同時,查找實例變量的時候也會不只僅查找someKey這個變量,也會查找_someKey這個變量是否存在。) 設計valueForUndefinedKey:方法的主要目的是當你使用-(id)valueForKey方法從對象中請求值時,對象可以在錯誤發生前,有最後的機會響應這個請求。這樣作有不少好處,下面的兩個例子說明了這樣作的好處。「來至cocoa,這個說法應該挺有道理。
由於咱們知道button倒是存在一個highlighted實例變量.所以爲什麼上面咱們只是add一個相關的keypath就好了,
能夠按照kvc查找的邏輯理解,就說的過去了
35.ARC自動引用技術
答:1.ARC是編譯特性,不是運行時特性,只是在編譯的時候,編譯器會自動加上釋放代碼
2.不能調用release、retain、autorelease、retainCount
3.dealloc注意
1> 不能在dealloc中調用[super dealloc]
2> 不能在dealloc中釋放資源
4.@property參數說明
1> retain 改成 strong
2> 基本數據類型(int\float)仍是用assign
3> copy 仍是 copy
4> 若是2個對象循環引用,一端用strong,一端用weak
5> weak是用在對象上,weak其實做用跟assign至關
5.ARC中只容許使用經過@autoreleasepool {}建立自動釋放池
36 GCD技術
答:Grand Central Dispatch簡稱GCD 解決多核並行運算的一種方案
看代碼就行:
// Grand Central Dispatch簡稱GCD技術
// Do any additional setup after loading the view.
// dispatch_queue_t newDispath = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// dispatch_async(newDispath, ^{
// [self downloadImage];
// });
// #defineDISPATCH_QUEUE_PRIORITY_HIGH 2
// #defineDISPATCH_QUEUE_PRIORITY_DEFAULT 0
// #defineDISPATCH_QUEUE_PRIORITY_LOW (-2)
// #defineDISPATCH_QUEUE_PRIORITY_BACKGROUNDINT16_MIN
/*dispatch queue分爲下面三種:
* Serial:又稱爲private dispatch queues,同時只執行一個任務。Serial queue一般用於同步訪問特定的資源或數據。當你建立多 個 Serial queue時,雖然它們各自是同步執行的,但Serial queue與Serial queue之間是併發執行的。
* Concurrent: 又稱爲global dispatch queue,能夠併發地執行多個任務,可是執行完成的順序是隨機的。
* Main dispatch queue它是全局可用的serial queue,它是在應用程序主線程上執行任務的
*/
// 通常GCD 能夠以下操做
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
// 耗時的操做
dispatch_async(dispatch_get_main_queue(), ^{
// 更新界面
});
});
[selfexampleDispatch];
/*
*系統給每個應用程序提供了三個concurrent dispatch queues。
*這三個併發調度隊列是全局的,它們只有優先級的不一樣。
*由於是全局的,咱們不須要去建立。咱們只須要經過使用函數dispath_get_global_queue去獲得隊列
*/
dispatch_queue_t globalQ =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
NSLog(@"global:%p",globalQ);
dispatch_queue_t mainQ =dispatch_get_main_queue();
NSLog(@"mainQ:%p",mainQ);
/*
*雖然dispatch queue是引用計數的對象,可是以上兩個都是全局的隊列,不用retain或release。
*/
/*
*dispatch_group_async能夠實現監聽一組任務是否完成,完成後獲得通知執行其餘的操做。
*這個方法頗有用,好比你執行三個下載任務,當三個任務都下載完成後你才通知界面說完成的了。
*/
timeInt = 0;
[NSTimerscheduledTimerWithTimeInterval:1
target:self
selector:@selector(checkingTime)
userInfo:nil
repeats:YES];
[selfexampleDispath_group];
/*dispatch_barrier_async的使用
*dispatch_barrier_async是在前面的任務執行結束後它才執行,並且它後面的任務等它執行完成以後纔會執行
*/
[selfexampleDispatch_barrier];
/*dispatch_apply
*執行某個代碼片斷N次。
*/
dispatch_apply(5, globalQ, ^(size_t index) {
// 執行5次
});
2.GCD 裏面有哪幾種 Queue? 背後的線程模型是什麼樣的?
GCD 中 Queue 的種類還要看咱們怎麼進行分類, 若是根據同一時間內處理的操做數分類的話, GCD 中的 Queue 分爲兩類
Serial Dispatch Queue
Concurrent Dispatch Queue
一類是串行派發隊列, 它只使用一個線程, 會等待當前執行的操做結束後纔會執行下一個操做, 它按照追加的順序進行處理. 另外一類是並行派發隊列, 它同時使用多個線程, 若是當前的線程數足夠, 那麼就不會等待正在執行的操做, 使用多個線程同時執行多個處理.
另外的一種分類方式以下:
Main Dispatch Queue
Global Dispatch Queue
Custom Dispatch Queue
主線程只有一個, 它是一個串行的進程. 全部追加到 Main Dispatch Queue 中的處理都會在 RunLoop 在執行. Global Dispatch Queue 是全部應用程序都能使用的並行派發隊列, 它有 4 個執行優先級 High, Default, Low, Background. 固然咱們也能夠使用 dispatch_queue_create 建立派發隊列.
14. NSOperation隊列
操做和操做隊列,基本能夠當作java中的線程和線程池的概念。用於處理ios多線程開發的問題。網上部分資料提到一點是,雖然是queue,可是卻並非帶有隊列的概念,放入的操做並不是是按照嚴格的先進現出。這邊又有個疑點是,對於隊列來講,先進先出的概念是Afunc添加進隊列,Bfunc緊跟着也進入隊列,Afunc先執行這個是必然的,可是Bfunc是等Afunc徹底操做完之後,B纔開始啓動而且執行,所以隊列的概念離亂上有點違背了多線程處理這個概念。可是轉念一想其實能夠參考銀行的取票和叫號系統。所以對於A比B先排隊取票可是B率先執行完操做,咱們亦然能夠感性認爲這仍是一個隊列。可是後來看到一票關於這操做隊列話題的文章,其中有一句提到「由於兩個操做提交的時間間隔很近,線程池中的線程,誰先啓動是不定的。」瞬間以爲這個queue名字有點忽悠人了,還不如pool~綜合一點,咱們知道他能夠比較大的用處在於能夠幫組多線程編程就行了。
11.數組和指針的區別
(1)數組能夠申請在棧區和數據區;指針能夠指向任意類型的內存塊
(2)sizeof做用於數組時,獲得的是數組所佔的內存大小;做用於指針時,獲得的都是4個字節的大小
(3)數組名錶示數組首地址,值不能夠改變,如不能夠將++做用於數組名上;普通指針的值能夠改變,如可將++做用於指針上
(4)用字符串初始化字符數組是將字符串的內容拷貝到字符數組中;用字符串初始化字符指針是將字符串的首地址賦給指針,也就是指針指向了該數組
12.static的做用
(1)函數體內static 變量的做用範圍爲該函數體,不一樣於 auto 變量,該變量的內存只被分配一次,
所以其值在下次調用時仍維持上次的值;
(2)在模塊內的static 全局變量能夠被模塊內所用函數訪問,但不能被模塊外其它函數訪問;
(3)在模塊內的static 函數只可被這一模塊內的其它函數調用,這個函數的使用範圍被限制在聲明
它的模塊內;
(4)在類中的static 成員變量屬於整個類所擁有,對類的全部對象只有一份拷貝;
(5)在類中的static 成員函數屬於整個類所擁有,這個函數不接收 this 指針,於是只能訪問類的static 成員變量。
13.簡述內存分區狀況
(1)代碼區:存放函數二進制代碼
(2)數據區:系統運行時申請內存並初始化,系統退出時由系統釋放。存放全局變量、靜態變量、常量
(3)堆區:經過malloc等函數或new等操做符動態申請獲得,需程序員手動申請和釋放
(4)棧區:函數模塊內申請,函數結束時由系統自動釋放。存放局部變量、函數參數
15.const char *p; charconst*p; char*const p; const char* const p;四個修飾指針有什麼區別
答: (1)定義了一個指向不可變的字符串的字符指針
(2)和(1)同樣
(3)定義了一個指向字符串的指針,該指針值不可改變,即不可改變指向
(4)定義了一個指向不可變的字符串的字符指針,且該指針也不可改變指向
30.HTTP協議中,POST和GET的區別是什麼?
答案:1.GET 方法
GET 方法提交數據不安全,數據置於請求行,客戶端地址欄可見;
GET 方法提交的數據大小有限
GET 方法不能夠設置書籤
2.POST 方法
POST 方法提交數據安全,數據置於消息主體內,客戶端不可見
POST 方法提交的數據大小沒有限制
POST 方法能夠設置書籤
31. iOS的系統架構分爲( 核心操做系統層 theCore OS layer )、( 核心服務層theCore Services layer )、( 媒體層 theMedia layer )和( Cocoa 界面服務層 the Cocoa Touch layer )四個層次。
32. 控件主要響應3種事件:( 基於觸摸的事件 )、( 基於值的事件 )和( 基於編輯的事件 )。
33. xib文件的構成分爲哪3個圖標?都具備什麼功能。(10分)
答: File’s Owner 是全部 nib 文件中的每一個圖標,它表示從磁盤加載 nib 文件的對象;
First Responder 就是用戶當前正在與之交互的對象;
View 顯示用戶界面;完成用戶交互;是 UIView 類或其子類。
38. UIView與CLayer有什麼區別(10分)?
答: 1. UIView 是 iOS 系統中界面元素的基礎,全部的界面元素都是繼承自它。它自己徹底是由 CoreAnimation 來實現的。它真正的繪圖部分,是由一個 CALayer 類來管理。 UIView 自己更像是一個 CALayer 的管理器,訪問它的跟繪圖和跟座標有關的屬性。
2. UIView 有個重要屬性 layer ,能夠返回它的主 CALayer 實例。
3. UIView 的 CALayer 相似 UIView 的子 View 樹形結構,也能夠向它的 layer 上添加子layer ,來完成某些特殊的表示。即 CALayer 層是能夠嵌套的。
4. UIView 的 layer 樹形在系統內部,被維護着三份 copy 。分別是邏輯樹,這裏是代碼能夠操縱的;動畫樹,是一箇中間層,系統就在這一層上更改屬性,進行各類渲染操做;顯示樹,其內容就是當前正被顯示在屏幕上得內容。
5. 動畫的運做:對 UIView 的 subLayer (非主 Layer )屬性進行更改,系統將自動進行動畫生成,動畫持續時間的缺省值彷佛是 0.5 秒。
6. 座標系統: CALayer 的座標系統比 UIView 多了一個 anchorPoint 屬性,使用CGPoint 結構表示,值域是 0~1 ,是個比例值。這個點是各類圖形變換的座標原點,同時會更改 layer 的 position 的位置,它的缺省值是 {0.5,0.5} ,即在 layer 的中央。
7. 渲染:當更新層,改變不能當即顯示在屏幕上。當全部的層都準備好時,能夠調用setNeedsDisplay 方法來重繪顯示。
8. 變換:要在一個層中添加一個 3D 或仿射變換,能夠分別設置層的 transform 或affineTransform 屬性。
9. 變形: Quartz Core 的渲染能力,使二維圖像能夠被自由操縱,就好像是三維的。圖像能夠在一個三維座標系中以任意角度被旋轉,縮放和傾斜。 CATransform3D 的一套方法提供了一些魔術般的變換效果。
41. Quatrz 2D的繪圖功能的三個核心概念是什麼並簡述其做用(10分)。
答:上下文:主要用於描述圖形寫入哪裏;
路徑:是在圖層上繪製的內容;
狀態:用於保存配置變換的值、填充和輪廓, alpha 值等。
42. iPhone OS主要提供了幾種播放音頻的方法(10分)?
答: SystemSound Services
AVAudioPlayer 類
Audio Queue Services
OpenAL
43. 使用AVAudioPlayer類調用哪一個框架、使用步驟(10分)?
答: AVFoundation.framework
步驟:配置 AVAudioPlayer 對象;
實現 AVAudioPlayer 類的委託方法;
控制 AVAudioPlayer 類的對象;
監控音量水平;
回放進度和拖拽播放。
46. CFSocket使用有哪幾個步驟(10分)。
答:建立 Socket 的上下文;建立 Socket ;配置要訪問的服務器信息;封裝服務器信息;鏈接服務器;
47. Core Foundation中提供了哪幾種操做Socket的方法(10分)?
答: CFNetwork 、 CFSocket 和 BSD Socket 。
59. 線程與進程的區別和聯繫?
答案 : 進程和線程都是由操做系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性。 程和線程的主要差異在於它們是不一樣的操做系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不一樣執行路徑。線程有本身的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,因此多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行而且又要共享某些變量的併發操做,只能用線程,不能用進程。
60. ios 平臺怎麼作數據的持久化?coredata 和sqlite有無必然聯繫?coredata是一個關係型數據庫嗎?
iOS 中能夠有四種持久化數據的方式:屬性列表、對象歸檔、 SQLite3 和 Core Data; core data 能夠使你以圖形界面的方式快速的定義 app 的數據模型,同時在你的代碼中容易獲取到它。 coredata 提供了基礎結構去處理經常使用的功能,例如保存,恢復,撤銷和重作,容許你在 app 中繼續建立新的任務。在使用 core data 的時候,你不用安裝額外的數據庫系統,由於 core data 使用內置的 sqlite 數據庫。 core data 將你 app 的模型層放入到一組定義在內存中的數據對象。 coredata 會追蹤這些對象的改變,同時能夠根據須要作相反的改變,例如用戶執行撤銷命令。當 core data 在對你 app 數據的改變進行保存的時候, core data 會把這些數據歸檔,並永久性保存。 mac os x 中sqlite 庫,它是一個輕量級功能強大的關係數據引擎,也很容易嵌入到應用程序。能夠在多個平臺使用, sqlite 是一個輕量級的嵌入式 sql 數據庫編程。與 core data 框架不一樣的是, sqlite 是使用程序式的, sql 的主要的 API 來直接操做數據表。 Core Data 不是一個關係型數據庫,也不是關係型數據庫管理系統 (RDBMS) 。雖然 Core Dta 支持SQLite 做爲一種存儲類型,但它不能使用任意的 SQLite 數據庫。 Core Data 在使用的過程種本身建立這個數據庫。 Core Data 支持對1、對多的關係。
進程的同步機制,並比較其優缺點
(a)信號量機制: PV操做可以實現對臨界區的管理要求;實現簡單;容許使用它的代碼休眠,持有鎖的時間可相對較長。一個信號量只能置一次初值,之後只能對之進行p操做或v操做。由此也能夠看到,信號量機制必須有公共內存,不能用於分佈式操做系統,這是它最大的弱點。信號量機制功能強大,但使用時對信號量的操做分散, 並且難以控制,讀寫和維護都很困難。加劇了程序員的編碼負擔;核心操做P-V分散在各用戶程序的代碼中,不易控制和管理;一旦錯誤,後果嚴重,且不易發現和糾正。
(b)自旋鎖: 旋鎖是爲了保護共享資源提出的一種鎖機制。調用者申請的資源若是被佔用,即自旋鎖被已經被別的執行單元保持,則調用者一直循環在那裏看是否該自旋鎖的保持着已經釋放了鎖。自旋鎖是一種比較低級的保護數據結構和代碼片斷的原始方式,可能會引發如下兩個問題; 一、死鎖 二、過多地佔用CPU資源 傳統自旋鎖因爲無序競爭會致使「公平性」問題
(c)管程: 信號量機制功能強大,但使用時對信號量的操做分散,並且難以控制,讀寫和維護都很困難。所以後來又提出了一種集中式同步進程——管程。其基本思想是將共享變量和對它們的操做集中在一個模塊中,操做系統或併發程序就由這樣的模塊構成。這樣模塊之間聯繫清晰,便於維護和修改,易於保證正確性。
(d)會合: 進程直接進行相互做用
(e)分佈式系統: 因爲在分佈式操做系統中沒有公共內存,所以參數全爲值參,並且不可爲指針。
(f)原語 是不可中斷的過程。加鎖/開鎖(LOCK/UNLOCK)原語優勢是實現互斥簡單;缺點是效率很低
2.進程間通訊的方式有______
(1)管道(Pipe):管道可用於具備親緣關係進程間的通訊,容許一個進程和另外一個與它有共同祖先的進程之間進行通訊。
(2)命名管道(named pipe):命名管道克服了管道沒有名字的限制,所以,除具備管道所具備的功能外,它還容許無親緣關係進程間的通訊。命名管道在文件系統中有對應的文件名。命名管道經過命令mkfifo或系統調用mkfifo來建立。
(3)信號(Signal):信號是比較複雜的通訊方式,用於通知接受進程有某種事件發生,除了用於進程間通訊外,進程還能夠發送信號給進程自己;linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction(實際上,該函數是基於BSD的,BSD爲了實現可靠信號機制,又可以統一對外接口,用sigaction函數從新實現了signal函數)。
(4)消息(Message)隊列:消息隊列是消息的連接表,包括Posix消息隊列system V消息隊列。有足夠權限的進程能夠向隊列中添加消息,被賦予讀權限的進程則能夠讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節流以及緩衝區大小受限等缺
(5)共享內存:使得多個進程能夠訪問同一塊內存空間,是最快的可用IPC形式。是針對其餘通訊機制運行效率較低而設計的。每每與其它通訊機制,如信號量結合使用,來達到進程間的同步及互斥。
(6)內存映射(mapped memory):內存映射容許任何多個進程間通訊,每個使用該機制的進程經過把一個共享的文件映射到本身的進程地址空間來實現它。
(7)信號量(semaphore):主要做爲進程間以及同一進程不一樣線程之間的同步手段。
(8)套接口(Socket):更爲通常的進程間通訊機制,可用於不一樣機器之間的進程間通訊。起初是由Unix系統的BSD分支開發出來的,但如今通常能夠移植到其它類Unix系統上:Linux和System V的變種都支持套接字。
23.http和scoket通訊的區別。
http是客戶端用http協議進行請求,發送請求時候須要封裝http請求頭,並綁定請求的數據,服務器通常有web服務器配合(固然也非絕 對)。 http請求方式爲客戶端主動發起請求,服務器才能給響應,一次請求完畢後則斷開鏈接,以節省資源。服務器不能主動給客戶端響應(除非採起http長鏈接 技術)。iphone主要使用類是NSUrlConnection。
scoket是客戶端跟服務器直接使用socket「套接字」進行鏈接,並無規定鏈接後斷開,因此客戶端和服務器能夠保持鏈接通道,雙方 均可以主動發送數據。通常在遊戲開發或股票開發這種要求即時性很強而且保持發送數據量比較大的場合使用。主要使用類是CFSocketRef。
TCP全稱是Transmission Control Protocol,中文名爲傳輸控制協議,它能夠提供可靠的、面向鏈接的網絡數據傳遞服務。傳輸控制協議主要包含下列任務和功能:
* 確保IP數據報的成功傳遞。
* 對程序發送的大塊數據進行分段和重組。
* 確保正確排序及按順序傳遞分段的數據。
* 經過計算校驗和,進行傳輸數據的完整性檢查。
五、TCP/IP 創建鏈接的過程
?
在TCP/IP 協議中,TCP協議提供可靠的鏈接服務,採用三次握手創建鏈接;
第一次握手:創建鏈接時,客戶端發送鏈接請求到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到客戶端鏈接請求,向客戶端發送容許鏈接應答,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的容許鏈接應答,向服務器發送確認,客戶端和服務器進入通訊狀態,完成三次握手。
(所謂的三次握手,就是要有三次鏈接信息的發送、接收過程。TCP連的創建須要進行三次鏈接信息的發送、接收。)
三、TCP/UDP區別聯繫
1>、TCP的全稱爲傳輸控制協議 這種協議能夠提供面向鏈接的、可靠的、點到點的通訊
2>、UDP的全稱爲用戶數據報協議,它能夠提供非鏈接的不可靠的點到多點的通訊
3>、用TCP仍是UDP,那要看你的程序注重南一方面? 可靠仍是快速?
8.Objective-C如何對內存管理的,說說你的見解和解決方法?
Objective-C的內存管理主要有三種方式ARC(自動內存計數)、手動內存計數、內存池。
1. (Garbage Collection)自動內存計數:這種方式和java相似,在你的程序的執行過程當中。始終有一個高人在背後準確地幫你收拾垃圾,你不用考慮它何時開始工做,怎樣工做。你只須要明白,我申請了一段內存空間,當我再也不使用從而這段內存成爲垃圾的時候,我就完全的把它忘記掉,反正那個高人會幫我收拾垃圾。遺憾的是,那個高人須要消耗必定的資源,在攜帶設備裏面,資源是緊俏商品因此iPhone不支持這個功能。因此「Garbage Collection」不是本入門指南的範圍,對「Garbage Collection」內部機制感興趣的同窗能夠參考一些其餘的資料,不過說老實話「Garbage Collection」不大適合適初學者研究。
解決: 經過alloc – initial方式建立的, 建立後引用計數+1, 此後每retain一次引用計數+1, 那麼在程序中作相應次數的release就行了.
2. (Reference Counted)手動內存計數:就是說,從一段內存被申請以後,就存在一個變量用於保存這段內存被使用的次數,咱們暫時把它稱爲計數器,當計數器變爲0的時候,那麼就是釋放這段內存的時候。好比說,當在程序A裏面一段內存被成功申請完成以後,那麼這個計數器就從0變成1(咱們把這個過程叫作alloc),而後程序B也須要使用這個內存,那麼計數器就從1變成了2(咱們把這個過程叫作retain)。緊接着程序A再也不須要這段內存了,那麼程序A就把這個計數器減1(咱們把這個過程叫作release);程序B也再也不須要這段內存的時候,那麼也把計數器減1(這個過程仍是release)。當系統(也就是Foundation)發現這個計數器變成了0,那麼就會調用內存回收程序把這段內存回收(咱們把這個過程叫作dealloc)。順便提一句,若是沒有Foundation,那麼維護計數器,釋放內存等等工做須要你手工來完成。
解決:通常是由類的靜態方法建立的, 函數名中不會出現alloc或init字樣, 如[NSString string]和[NSArray arrayWithObject:], 建立後引用計數+0, 在函數出棧後釋放, 即至關於一個棧上的局部變量. 固然也能夠經過retain延長對象的生存期.
3. (NSAutoRealeasePool)內存池:能夠經過建立和釋放內存池控制內存申請和回收的時機.
解決:是由autorelease加入系統內存池, 內存池是能夠嵌套的, 每一個內存池都須要有一個建立釋放對, 就像main函數中寫的同樣. 使用也很簡單, 好比[[[NSString alloc]initialWithFormat:@」Hey you!」] autorelease], 即將一個NSString對象加入到最內層的系統內存池, 當咱們釋放這個內存池時, 其中的對象都會被釋放.
十、內存不足,系統會發出警告,此時控制器應該如何處理
內存不足時,系統會調用控制器的didReceiveMemoryWarning方法通知控制器內存不足。iOS6.0與6.0以前的處理方式不同。
1>、6.0以前,調用didReceiveMemoryWarning後,將self.view設置爲nil,而且再調用viewDidUnload方法,在此方法中咱們應該釋放子視圖!
2>、6.0以後,調用didReceiveMemoryWarning後,再也不調用viewDidUnload方法,則應該在didReceiveMemoryWarning方法中手動將self.view=nil,而且釋放子視圖!
40id、nil表明什麼?
id和void *並不是徹底同樣。在上面的代碼中,id是指向struct objc_object的一個指針,這個意思基本上是說,id是一個指向任何一個繼承了Object(或者NSObject)類的對象。須要注意的是id是一個指針,因此你在使用id的時候不須要加星號。好比id foo=nil定義了一個nil指針,這個指針指向NSObject的一個任意子類。而id *foo=nil則定義了一個指針,這個指針指向另外一個指針,被指向的這個指針指向NSObject的一個子類。
nil和C語言的NULL相同,在objc/objc.h中定義。nil表示一個Objctive-C對象,這個對象的指針指向空(沒有東西就是空)。
首字母大寫的Nil和nil有一點不同,Nil定義一個指向空的類(是Class,而不是對象)。
1.AFNetworking或SDWebImage 裏面給 UIImageView 加載圖片的邏輯是什麼樣的?
SDWebImage 中爲 UIView 提供了一個分類叫作 WebCache, 這個分類中有一個最經常使用的接口, sd_setImageWithURL:placeholderImage: , 這個分類同時提供了不少相似的方法, 這些方法最終會調用一個同時具備 option progressBlock completionBlock 的方法, 而在這個類最終被調用的方法首先會檢查是否傳入了 placeholderImage 以及對應的參數, 並設置 placeholderImage .
而後會獲取 SDWebImageManager 中的單例調用一個 downloadImageWithURL:... 的方法來獲取圖片, 而這個 manager 獲取圖片的過程有大致上分爲兩部分, 它首先會在 SDWebImageCache 中尋找圖片是否有對應的緩存, 它會以 url 做爲數據的索引先在內存中尋找是否有對應的緩存, 若是緩存未命中就會在磁盤中利用 MD5 處理過的 key 來繼續查詢對應的數據, 若是找到了, 就會把磁盤中的緩存備份到內存中.
然而, 假設咱們在內存和磁盤緩存中都沒有命中, 那麼 manager 就會調用它持有的一個 SDWebImageDownloader 對象的方法 downloadImageWithURL:... 來下載圖片, 這個方法會在執行的過程當中調用另外一個方法 addProgressCallback:andCompletedBlock:fotURL:createCallback: 來存儲下載過程當中和下載完成的回調, 當回調塊是第一次添加的時候, 方法會實例化一個 NSMutableURLRequest 和 SDWebImageDownloaderOperation , 並將後者加入 downloader 持有的下載隊列開始圖片的異步下載.
而在圖片下載完成以後, 就會在主線程設置 image, 完成整個圖像的異步下載和配置.
4.什麼是iOS中的沙盒機制。
IOS中的沙盒機制(SandBox)是一種安全體系,它規定了應用程序只能在爲該應用建立的文件夾內讀取文件,不能夠訪問其餘地方的內容。
1.每一個應用程序都在本身的沙盒內
2.不能隨意跨越本身的沙盒去訪問別的應用程序沙盒的內容
3.應用程序向外請求或接收數據都須要通過權限認證
默認狀況下,每一個沙盒含有3個文件夾:Documents, Library 和 tmp。由於應用的沙盒機制,應用只能在幾個目錄下讀寫文件
Documents:蘋果建議將程序中創建的或在程序中瀏覽到的文件數據保存在該目錄下,iTunes備份和恢復的時候會包括此目錄
Library:存儲程序的默認設置或其它狀態信息;
Library/Caches:存放緩存文件,iTunes不會備份此目錄,此目錄下文件不會在應用退出刪除
tmp:提供一個即時建立臨時文件的地方
4.nil, Nil, NSNULL, NULL區別
nil是指向obj-c中對象的空指針,是一個對象,在o-c中ni對象調用方法不會引發crash。
Nil是指向obj-c中的類的空指針,表示的是一個空類。
NULL是指向任何類型的空指針(如c/c++中的空指針),在objective-c中是一個數值。
NSNULL用於集合操做,在集合對象中,表示一個空值的集合對象。
5.iOS中處理音頻和視頻使用哪些框架?
AVFoundation(基於Core Audio、Core Video、Core Media等框架)、MediaPlayer、UIKit
1.如何監聽View的觸摸事件,事件是如何傳遞的、視圖的響應者鏈是什麼?
(1)覆寫View類的touchBegin、touchMove、touchEnd系列方法監聽視圖的觸摸。
(2)事件傳遞:當觸摸一個視圖時,首先系統會捕捉此事件,併爲此事件建立一個UIEvent對 象,將此對象加入當前應用程序的事件隊列中,而後由UIApplication對象從隊列中,一個一個取出來進⾏分發,⾸首先分發給UIWindow對象,而後由UIWindow對象分發給觸摸的視圖對 象,也就是第一響應者對象。!
(3)響應者鏈: 事件被交由第一響應者對象處理,若是第一響應者不處理,事件被沿着響應 者鏈向上傳遞,交給下一個響應者(next responder)。通常來講,第一響應者是個視圖對 象或者其子類對象,當其被觸摸後事件被交由它處理,若是它不處理,事件就會被傳遞給它 的視圖控制器對象(若是存在),而後是它的父視圖(superview)對象(若是存在),以 此類推,直到頂層視圖。接下來會沿着頂層視圖(top view)到窗⼝口(UIWindow對象)再 到程序(UIApplication對象)。若是整個過程都沒有響應這個事件,該事件就被丟棄。通常 狀況下,在響應者鏈中只要由對象處理事件,事件就停⽌傳遞。但有時候能夠在視圖的響應 ⽅方法中根據一些條件判斷來決定是否須要繼續傳遞事件。
2五、響應者鏈的概念
響應者鏈表示一系列的響應者對象。事件被交由第一響應者對象處理,若是第一響應者不處理,事件被沿着響應者鏈向上傳遞,交給下一個響應者(next responder)。通常來講,第一響應者是個視圖對象或者其子類對象,當其被觸摸後事件被交由它處理,若是它不處理,事件就會被傳遞給它的視圖控制器對象(若是存在),而後是它的父視圖(superview)對象(若是存在),以此類推,直到頂層視圖。接下來會沿着頂層視圖(top view)到窗口(UIWindow對象)再到程序(UIApplication對象)。若是整個過程都沒有響應這個事件,該事件就被丟棄。通常狀況下,在響應者鏈中只要由對象處理事件,事件就中止傳遞。但有時候能夠在視圖的響應方法中根據一些條件判斷來決定是否須要繼續傳遞事件。
三、c語言中extern的做用,extern c的做用?
1>extern能夠置於變量或者函數前,以標示變量或者函數的定義在別的文件中,提示編譯器遇到此變量和函數時在其餘模塊中尋找其定義
2>c++語言在編譯的時候爲了解決函數的多態問題,會將函數名和參數聯合起來生成一箇中間的函數名稱,而c語言則不會,所以會形成連接時找不到對應函數的狀況,此時c函數就須要extern「C」進行連接指定,這告訴編譯器,請保持個人名稱,不要給我生成用於連接的中間函數名
2.xml數據的解析方式,各有什麼不一樣?
(1)xml數據解析有兩種解析⽅方式:DOM解析與SAX解析!
(2)DOM解析必須先完成DOM樹的構造,在處理規模較大的XML文檔時就很耗內存,佔⽤資 源較多!
(3)與DOM不一樣的是,它是⽤用事件驅動模型,解析XMl⽂文檔時每遇到一個開始或者結束標 籤、 或者屬性、或者一條指令時,程序就產⽣生一個事件來進⾏行相應的處理,所以,SAX相對於 DOM來講更適合操做⼤的XML文檔!
1.Core Graphics 和Quartz 2D的區別?
quartz是一個通用的術語,用於描述在IOS和MAC OS X ZHONG 整個媒體層用到的多種技術 包括圖形、動畫、音頻、適配。
Quart 2D 是一組二位繪圖和渲染API,Core Graphic會使用到這組API
Quartz Core 專指Core Animation用到的動畫相關的庫、API和類。
3九、Cocoa Touch框架
UIKit、Foundation、CoreGraphic、QuartzCore
1>音頻和視頻
Core Audio
OPenAL
Media Library
AV Foundation
2>數據管理
Core Data
SQLite
3>圖形和動畫
Core Animation
OpenGL ES
Quartz 2D
4>用戶應用
Address Book
Core Location
Map Kit
Store Kit
4七、單例設計模式的實現,爲何使用單例設計
static File * instance = nil;
@implementation File
//獲取單例的方法
+(id)shareInstance
{
@synchronized(self)
{
if(instance == nil)
{
instance = [[File alloc]init];
}
}
return instance;
}
覆寫allocWithZone、copyWithZone、retain、authorelease 方法,目的是限制這個類只建立一個對象
1九、用過哪些開源網絡框架各有什麼特色
1>、ASIHTTPRequest
優勢:出來比較早、功能強大、文檔豐富(目前不少應用還在使用)
缺點:已經中止更新、新特性少、厚重且對iOS5以上支持不夠完善。
2>、AFNetWorking
優勢:支持比較新的特性、簡單易用
缺點:文檔數目通常、功能少、忽略拉一些擴展功能(如:沒有同步請求)
3>、MKNetWorking
優勢:支持arc、一個印度大卡寫的。有ASIHTTPRequest的功能,AFNetWorking的輕便
缺點:文檔數目最少(幾乎沒有)
2八、ASI網絡框架有哪些功能?
1>、ASI是款極其強勁的HTTP訪問開源框架;
2>、功能:異步請求 隊列請求 gzip壓縮 緩存 斷點續傳 進度跟蹤 上傳文件 HTTP認證
20、iOS中有哪些數據持久化的方式,各有什麼特色,ios平臺怎麼作數據的持久化?CoreData 和sqlite有無必然的聯繫?CoreData是一個關係型數據庫嗎?
1>、主要有四種持久化方式:屬性列表、對象歸檔、SQLLite、coredata。
2>、CoreData不是一個數據庫,不過能夠使用SQLLite數據庫來保持數據,也能夠使用其餘的方式存儲數據,如XML。
3>、屬性列表、對象歸檔適合小數據量存儲和查詢操做。
4>、SQLite、CoreData適合大數據存儲和查詢操做。
2一、iPhone5如何適配
1>、添加啓動圖片,Default-568h@2x.png 分辨率640*1136 pixels
2>、在編碼時,儘可能不要寫死480*320的尺寸,使用UIScreen獲取硬件的物理尺寸
3>、經過設置autosizing 來適應在父視圖中的frame
2二、iOS中如何捕捉異常
@try{}
@catch{}
2三、用過單元測試嗎
iOS自帶了一個測試框架OCUnit,但目前最好用的測試框架應該是GHUnit
2五、蘋果APP的上架流程、什麼狀況下會被打回
1>、訪問私有API
2>、APP有嚴重deBUG
3>、給蘋果審覈的測試帳號沒法登錄,或者境外沒法訪問國內服務器
4>、APP描述中帶「Beta」字樣,或是其餘代表APP還未開發完成的信息
5>、APP加載時間過長,iOS APP的最長啓動時間不得超過15秒
6>、給出外部購買連接
7>、APP描述中提到了iOS以外的其餘支持平臺
2六、tableView是如何複用的?
若是屏幕上能顯示10個單元格,則tableView只會建立11個單元格,也就是n+1,當滑到第12個單元格時就會複用第1個單元格對象。tableView中有個單元格池這麼一個概念,tableView調用協議方法獲取單元格時,先從池子中查找是否有可複用的單元格,若是有則複用,沒有則建立一個單元格對象
2七、如何優化tableView的滑動速度
1>、複用單元格;
2>、使用不透明的視圖,單元格中儘可能少使用動畫;
3>、圖片加載使用異步加載,而且設置圖片加載的併發數;
4>、滑動時不加載圖片,中止滑動開始加載;
5>、文字,圖片能夠直接drawInRect繪製;
6>、如非必要,減小reloadData所有的cell,只reloadRowsAtIndexPaths;
7>、若是Cell是動態行高,計算出高度後緩存;
8>、Cell高度固定的話直接cell.rowHeight設置高度
3一、如何將產品進行多語言發佈,作國際化開發
1>、新建String File文件,命名爲 Localizable.strings, 往裏面添加你想要的語言支持
2>、在不一樣語言的 Localizable.strings文件中添加對應的文本
3>、XIB文件國際化
4>、程序名稱國際化
參考:http://hi.baidu.com/yunhuaikong/item/d8e8e2e4be13a8088c3ea829
3七、iOS中都有哪些手勢
iOS提供了不少手勢對象用於識別不一樣的手勢操做,手勢:輕擊,捏合,平移,輕掃,旋轉,長按
40、二維碼掃描用過哪些類庫,這些類庫有什麼特色?
二維碼生成:QRGener
二維碼掃描:zxing,ZBarSDK
二維碼掃描:推薦使用zxing,由於zxing能夠自定義掃描區域,並且是開源的,可是這個庫集成起來比較複雜
4四、StoryBoard用過嗎,有什麼特色?
1>、StoryBoard是iOS5新增的特性,是對xib的升級版本,引入了一個容器用於管理多個xib文件,和他們之間的跳轉交互
2>、有點:不用在爲每一個控制器建立xib文件了
3>、缺點: StoryBoard單個文件,不利於團隊協做開發
4五、如何打包靜態庫?
新建一個Framework&Library的項目,編譯的時候,會將項目中的代碼文件打包成一個.a的靜態庫文件
4六、App發佈的上架流程?
1>、在蘋果網站的開發者中心,新建一個App,填寫此APP相關的一些描述信息
2>、下載安裝發佈證書
3>、選擇發佈證書,是與Archive生成發佈包
4>、使用xcode提交發布包
答:序列化是將對象狀態轉換爲可保持或傳輸的格式的過程,在序列化過程當中,對象的公共字段和私有字段以及類的名稱(包括包含該類的程序集)都被轉換爲字節流,而後寫入數據流。與序列化相對的是反序列化,它將流轉換爲對象。這兩個過程結合起來,能夠輕鬆地存儲和傳輸數據。(在iphone中要實現對象序列化,首相被序列化的對象必須NSCodeing 協議和NSCopying 協議,並分別實現兩個協議的方法:NSCoding- (void)encodeWithCoder:(NSCoder *)encoder; - (id)initWithCoder:(NSCoder *)decoder #NSCoding:- (id)copyWithZone:(NSZone *)zone )
爲什要對象序列化?a. 一個緣由是將對象的狀態保持在存儲媒體中,以即可以在之後從新建立精確的副本。
咱們常常須要將對象的字段值保存到磁盤中,並在之後檢索此數據。儘管不使用序列化也能完成這項工做,但這種方法一般很繁瑣並且容易出錯,而且在須要跟蹤 對象的層次結構時,會變得愈來愈複雜。能夠想象一下編寫包含大量對象的大型業務應用程序的情形,程序員不得不爲每個對象編寫代碼,以便將字段和屬性保存 至磁盤以及從磁盤還原這些字段和屬性。序列化提供了輕鬆實現這個目標的快捷方法。
b.另外一個緣由是經過值將對象從一個應用程序域發送到另外一個應用程序域中。
例如,序列化可用於在 ASP.NET 中保存會話狀態並將對象複製到 Windows 窗體的剪貼板中。遠程處理還能夠使用序列化經過值將對象從一個應用程序域傳遞到另外一個應用程序域中。
答:線程是一組指令集合,或者是程序的特殊段,它能夠在程序裏獨立執行,也可把它理解爲代碼運行的上下文,線程是在同一時間須要完成多項任務的時候被實現的。
,進程和線程都是由操做系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性.簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.
線程的劃分尺度小於進程,使得多線程程序的併發性高。
另外,進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存,從而極大地提升了程序的運行效率
注意多線程數據共享管理的問題和死鎖問題(形成死鎖的4個必備條件:互斥、請求保持、不可剝奪、環路),怎樣解決死鎖問題? 答案:鴕鳥策略、預防策略、避免策略、檢測與解除死鎖
Iphone代碼上怎麼解決死鎖問題?建立操做隊列NSOperationQueue(至關於java中的線程池)用操做隊列來管理多個任務對象(繼承自NSOperation),每一個任務對象去各自完成本身的行爲。。。。
答:每一個線程內部都有本身的Run loop(這裏不是指特定類,就是一個循環)。 線程常見的狀況以下 while(stopThread_bool){ } 就是這個循環。 既然obj-c有runtime能力,因此apple就開發了 NSRunLoop 類,來管理線程內的循環,能夠在程序運行時添加,刪除和修改loop內的代碼 。固然同時NSRunLoop有MainThread循環的管理功能,這樣你能夠給MainThread runloop裏面插入你本身但願執行的代碼(通常狀況是界面更新有關的函數)。亦或給本身定義的thread加入一個NSRunLoop對象,動態管理線程執行的代碼。 這樣一個線程內的代碼可能會 while(stopThread_bool){ //custom code NSArray *funArray=[[self runloopObj] loopFunArray]; foreach(fun in funArray){ [self performSeletor:@selector(fun)]; } } 以上是一個假想的Thread和它的NSRunLoop實例交互的僞代碼。 1.首先你要看到你認識上的問題,在書裏介紹的runloop != while or for語句 2.每一個線程都有本身的NSRunLoop,他們是本身創建的 3.並非因此線程都須要使用它的NSRunLoop. 若是線程的runloop沒有本身的input source,它不會運行。 4.如下幾個狀況是須要用線程的runloop Use ports or custom input sources to communicate with other threads. Use timers on the thread. Use any of the performSelector… methods in a Cocoa application. Keep the thread around to perform periodic tasks. 5. - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait 這樣的語句實際上就是在向Main Thread的runloop對象添加input source. 我不知道怎麼解釋你才能更清楚,也許你能夠再多說說你不理解的地方。 另外一個說法:runloop一個UI事件,Timer call, delegate call,都會是一個新的runloop。