IOS面試題系列
-(void)setName:(NSString*)str{[strretain];[namerelease];name=str;}-(void)setName:(NSString*)str{idt=[strcopy];[namerelease];name=t;}5.對於語句NSString*obj = [[NSData alloc] init]; obj在編譯時和運行時分別時什麼類型的對象?編譯時是NSString的類型;運行時是NSData類型的對象6.常見的object-c的數據類型有那些, 和C的基本數據類型有什麼區別?如:NSInteger和intobject-c的數據類型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,創建後便是對象,而C語言的基本數據類型int,只是一定位元組的內存空間,用於存放數值;NSInteger是基本數據類型,並不是NSNumber的子類,當然也不是NSObject的子類。NSInteger是基本數據類型Int或者Long的別名(NSInteger的定義typedef long NSInteger),它的區別在於,NSInteger會根據系統是32位還是64位來決定是本身是int還是Long。7.id 聲明的對象有什麼特性?Id 聲明的對象具有運行時的特性,即可以指向任意類型的objcetive-c的對象;8.Objective-C如何對內存管理的,說說你的看法和解決方法?Objective-C的內存管理主要有三種方式ARC(自動內存計數)、手動內存計數、內存池。9.內存管理的幾條原則時什麼?按照默認法則.那些關鍵字生成的對象需要手動釋放?在和property結合的時候怎樣有效的避免內存泄露?誰申請,誰釋放遵循Cocoa Touch的使用原則;內存管理主要要避免「過早釋放」和「內存泄漏」,對於「過早釋放」需要注意@property設置特性時,一定要用對特性關鍵字,對於「內存泄漏」,一定要申請了要負責釋放,要細心。關鍵字alloc 或new 生成的對象需要手動釋放;設置正確的property屬性,對於retain需要在合適的地方釋放,10.如何對iOS設備進行性能測試?Profile-> Instruments ->Time Profiler11.看下面的程序,第一個NSLog會輸出什麼?這時str的retainCount是多少?第二個和第三個呢? 為什麼?[cpp]view plaincopyprint?
=======================================================NSMutableArray*ary=[[NSMutableArrayarray]retain];NSString*str=[NSStringstringWithFormat:@"test"];[strretain];[aryaddObject:str];NSLog(@"%@%d",str,[strretainCount]);[strretain];[strrelease];[strrelease];NSLog(@"%@%d",str,[strretainCount]);[aryremoveAllObjects];NSLog(@"%@%d",str,[strretainCount]);=======================================================str的retainCount創建+1,retain+1,加入數組自動+13retain+1,release-1,release-12數組刪除所有對象,所有數組內的對象自動-1112. Object C中創建線程的方法是什麼?如果在主線程中執行代碼,方法是什麼?如果想延時執行代碼、方法又是什麼?線程創建有三種方法:使用NSThread創建、使用GCD的dispatch、使用子類化的NSOperation,然後將其加入NSOperationQueue;在主線程執行代碼,方法是performSelectorOnMainThread,如果想延時執行代碼可以用performSelector:onThread:withObject:waitUntilDone:13.描述一下iOS SDK中如何實現MVC的開發模式MVC是模型、試圖、控制開發模式,對於iOS SDK,所有的View都是視圖層的,它應該獨立於模型層,由視圖控制層來控制。所有的用戶數據都是模型層,它應該獨立於視圖。所有的ViewController都是控制層,由它負責控制視圖,訪問模型數據。===============iOS進階面試題----Block部分iOS進階面試題----多線程部分1.Difference between shallow copy and deep copy?淺複製和深複製的區別?答案:淺層複製:只複製指向對象的指針,而不複製引用對象本身。深層複製:複製引用對象本身。意思就是說我有個A對象,複製一份後得到A_copy對象後,對於淺複製來說,A和A_copy指向的是同一個內存資源,複製的只不過是是一個指針,對象本身資源還是只有一份,那如果我們對A_copy執行了修改操作,那麼發現A引用的對象同樣被修改,這其實違背了我們複製拷貝的一個思想。深複製就好理解了,內存中存在了兩份獨立對象本身。用網上一哥們通俗的話將就是:淺複製好比你和你的影子,你完蛋,你的影子也完蛋深複製好比你和你的克隆人,你完蛋,你的克隆人還活著。2.What is advantage of categories? What is difference between implementing a category and inheritance?類別的作用?繼承和類別在實現中有何區別?答案:category 可以在不獲悉,不改變原來代碼的情況下往裡面添加新的方法,只能添加,不能刪除修改。並且如果類別和原來類中的方法產生名稱衝突,則類別將覆蓋原來的方法,因為類別具有更高的優先順序。類別主要有3個作用:(1)將類的實現分散到多個不同文件或多個不同框架中。(2)創建對私有方法的前向引用。(3)向對象添加非正式協議。繼承可以增加,修改或者刪除方法,並且可以增加屬性。3.Difference between categories and extensions?類別和類擴展的區別。答案:category和extensions的不同在於 後者可以添加屬性。另外後者添加的方法是必須要實現的。extensions可以認為是一個私有的Category。4.Difference between protocol in objective c and interfaces in java?oc中的協議和java中的介面概念有何不同?答案:OC中的協議有2層含義,官方定義為 formal和informal protocol。前者和Java介面一樣。informal protocol中的方法屬於設計模式考慮範疇,不是必須實現的,但是如果有實現,就會改變類的屬性。其實關於正式協議,類別和非正式協議我很早前學習的時候大致看過,也寫在了學習教程里「非正式協議概念其實就是類別的另一種表達方式「這裡有一些你可能希望實現的方法,你可以使用他們更好的完成工作」。這個意思是,這些是可選的。比如我門要一個更好的方法,我們就會申明一個這樣的類別去實現。然後你在後期可以直接使用這些更好的方法。這麼看,總覺得類別這玩意兒有點像協議的可選協議。"現在來看,其實protocal已經開始對兩者都統一和規範起來操作,因為資料中說「非正式協議使用interface修飾「,現在我們看到協議中兩個修飾詞:「必須實現(@requied)」和「可選實現(@optional)」。OC中的協議(formal protocol)與java中的介面概念基本一致,OC中非正式協議(informal protocol)就是類別。在java中如果繼承了介面,但不實現其方法,會得到一個error(無法編譯);在OC中的正式協議,如果不實現,會得到一個warning(可編譯執行),如果想去除waring,還可以加關鍵字(@optional),讓它可選實現方法。5.What are 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查找的邏輯理解,就說的過去了。6.What is purpose of delegates?代理的作用?答案:代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針。可以減少框架複雜度。另外一點,代理可以理解為java中的回調監聽機制的一種類似。7.What are mutable and immutable types in Objective C?oc中可修改和不可以修改類型。答案:可修改不可修改的集合類。這個我個人簡單理解就是可動態添加修改和不可動態添加修改一樣。比如NSArray和NSMutableArray。前者在初始化後的內存控制項就是固定不可變的,後者可以添加等,可以動態申請新的內存空間。8.When we call objective c is runtime language what does it mean?我們說的oc是動態運行時語言是什麼意思?答案:多態。 主要是將數據類型的確定由編譯時,推遲到了運行時。這個問題其實淺涉及到兩個概念,運行時和多態。簡單來說,運行時機制使我們直到運行時才去決定一個對象的類別,以及調用該類別對象指定方法。多態:不同對象以自己的方式響應相同的消息的能力叫做多態。意思就是假設生物類(life)都用有一個相同的方法-eat;那人類屬於生物,豬也屬於生物,都繼承了life後,實現各自的eat,但是調用是我們只需調用各自的eat方法。也就是不同的對象以自己的方式響應了相同的消息(響應了eat這個選擇器)。因此也可以說,運行時機制是多態的基礎?~~~9.what is difference between NSNotification and protocol?通知和協議的不同之處?答案:協議有控制鏈(has-a)的關係,通知沒有。首先我一開始也不太明白,什麼叫控制鏈(專業術語了~)。但是簡單分析下通知和代理的行為模式,我們大致可以有自己的理解簡單來說,通知的話,它可以一對多,一條消息可以發送給多個消息接受者。代理按我們的理解,到不是直接說不能一對多,比如我們知道的明星經濟代理人,很多時候一個經濟人負責好幾個明星的事務。只是對於不同明星間,代理的事物對象都是不一樣的,一一對應,不可能說明天要處理A明星要一個發布會,代理人發出處理髮布會的消息後,別稱B的發布會了。但是通知就不一樣,他只關心發出通知,而不關心多少接收到感興趣要處理。因此控制鏈(has-a從英語單詞大致可以看出,單一擁有和可控制的對應關係。10.What is push notification?什麼是推送消息?答案:太簡單,不作答~~~~~~~~~~這是cocoa上的答案。其實到不是說太簡單,只是太泛泛的一個概念的東西。就好比說,什麼是人。推送通知更是一種技術。簡單點就是客戶端獲取資源的一種手段。普通情況下,都是客戶端主動的pull。推送則是伺服器端主動push。測試push的實現可以查看該博文。11.Polymorphism?關於多態性答案:多態,子類指針可以賦值給父類。這個題目其實可以出到一切面向對象語言中,因此關於多態,繼承和封裝基本最好都有個自我意識的理解,也並非一定要把書上資料上寫的能背出來。最重要的是轉化成自我理解。12.Singleton?對於單例的理解答案:11,12題目其實出的有點泛泛的感覺了,可能說是編程語言需要或是必備的基礎。基本能用熟悉的語言寫出一個單例,以及可以運用到的場景或是你編程中碰到過運用的此種模式的框架類等。進一步點,考慮下如何在多線程訪問單例時的安全性。13.What is responder chain?說說響應鏈答案: 事件響應鏈。包括點擊事件,畫面刷新事件等。在視圖棧內從上至下,或者從下之上傳播。可以說點事件的分發,傳遞以及處理。具體可以去看下touch事件這塊。因為問的太抽象化了嚴重懷疑題目出到越後面就越籠統。可以從責任鏈模式,來講通過事件響應鏈處理,其擁有的擴展性14.Difference between frame and bounds?frame和bounds有什麼不同?答案:frame指的是:該view在父view坐標系統中的位置和大小。(參照點是父親的坐標系統)bounds指的是:該view在本身坐標系統中 的位置和大小。(參照點是本身坐標系統)15.Difference between method and selector?方法和選擇器有何不同?答案:selector是一個方法的名字,method是一個組合體,包含了名字和實現.詳情可以看apple文檔。16.Is there any garbage collection mechanism in Objective C.?OC的垃圾回收機制?答案: OC2.0有Garbage collection,但是iOS平台不提供。一般我們了解的objective-c對於內存管理都是手動操作的,但是也有自動釋放池。但是差了大部分資料,貌似不要和arc機制搞混就好了。求更多~~17.NSOperation queue?答案:存放NSOperation的集合類。操作和操作隊列,基本可以看成java中的線程和線程池的概念。用於處理ios多線程開發的問題。網上部分資料提到一點是,雖然是queue,但是卻並不是帶有隊列的概念,放入的操作並非是按照嚴格的先進現出。這邊又有個疑點是,對於隊列來說,先進先出的概念是Afunc添加進隊列,Bfunc緊跟著也進入隊列,Afunc先執行這個是必然的,但是Bfunc是等Afunc完全操作完以後,B才開始啟動並且執行,因此隊列的概念理論上有點違背了多線程處理這個概念。但是轉念一想其實可以參考銀行的取票和叫號系統。因此對於A比B先排隊取票但是B率先執行完操作,我們亦然可以感性認為這還是一個隊列。但是後來看到一票關於這操作隊列話題的文章,其中有一句提到「因為兩個操作提交的時間間隔很近,線程池中的線程,誰先啟動是不定的。」瞬間覺得這個queue名字有點忽悠人了,還不如pool~綜合一點,我們知道他可以比較大的用處在於可以幫助多線程編程就好了。樓上區分了線程執行時的次序(Afunc和Bfunc誰先啟動)和線程執行完成(Afunc和Bfunc誰先執行完)時的次序不同,而多線程的重要概念是並發(同時執行多個任務),NSOperationQueue是管理並發線程的對象,可以在其中放入NSOpertation對象(對象化的線程實體),通過設置maxConcurrentOperationCount的大小,控制並發數目,如樓上所說希望「Afunc添加進隊列,執行完後,Bfunc緊跟進入隊列,繼續執行」,那隻需將maxConcurrentOperationCount設為1,變會依次執行,這時候實際是在單線程依次執行。所以這裡的NSOperationQueue就是對象化抽象的去管理多線程,這樣的好處,使用者通過繼承NSOperation對象,可以方便的用對象來管理線程,而不再用關心線程同步、信號量等細節,更多地關注於業務邏輯。18.What is lazy loading?答案:懶漢模式,只在用到的時候才去初始化。也可以理解成延時載入。我覺得最好也最簡單的一個列子就是tableView中圖片的載入顯示了。一個延時載,避免內存過高,一個非同步載入,避免線程堵塞。19.Can we use two tableview controllers on one viewcontroller?是否在一個視圖控制器中嵌入兩個tableview控制器?答案:一個視圖控制只提供了一個View視圖,理論上一個tableViewController也不能放吧,只能說可以嵌入一個tableview視圖。當然,題目本身也有歧義,如果不是我們定性思維認為的UIViewController,而是宏觀的表示視圖控制者,那我們倒是可以把其看成一個視圖控制者,它可以控制多個視圖控制器,比如TabbarController那樣的感覺。20.Can we use one tableview with two different datasources? How you will achieve this?一個tableView是否可以關聯兩個不同的數據源?你會怎麼處理?答案:首先我們從代碼來看,數據源如何關聯上的,其實是在數據源關聯的代理方法里實現的。因此我們並不關心如何去關聯他,他怎麼關聯上,方法只是讓我返回根據自己的需要去設置如相關的數據源。因此,我覺得可以設置多個數據源啊,但是有個問題是,你這是想幹嘛呢?想讓列表如何顯示,不同的數據源分區塊顯示?===============================iOS進階面試題----Block部分iOS進階面試題----多線程部分1.When to use NSMutableArray and when to use NSArray?什麼時候使用NSMutableArray,什麼時候使用NSArray?答案:當數組在程序運行時,需要不斷變化的,使用NSMutableArray,當數組在初始化後,便不再改變的,使用NSArray。需要指出的是,使用NSArray只表明的是該數組在運行時不發生改變,即不能往NSAarry的數組裡新增和刪除元素,但不表明其數組內的元素的內容不能發生改變。NSArray是線程安全的,NSMutableArray不是線程安全的,多線程使用到NSMutableArray需要注意。2.Give us example of what are delegate methods and what are data source methods of uitableview.給出委託方法的實例,並且說出UITableVIew的Data Source方法答案:CocoaTouch框架中用到了大量委託,其中UITableViewDelegate就是委託機制的典型應用,是一個典型的使用委託來實現適配器模式,其中UITableViewDelegate協議是目標,tableview是適配器,實現UITableViewDelegate協議,並將自身設置為talbeview的delegate的對象,是被適配器,一般情況下該對象是UITableViewController。UITableVIew的Data Source方法有- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath;3.How many autorelease you can create in your application? Is there any limit?在應用中可以創建多少autorelease對象,是否有限制?答案:無4.If we don』t create any autorelease pool in our application then is there any autorelease pool already provided to us?如果我們不創建內存池,是否有內存池提供給我們?答案:界麵線程維護著自己的內存池,用戶自己創建的數據線程,則需要創建該線程的內存池5.When you will create an autorelease pool in your application?什麼時候需要在程序中創建內存池?答案:用戶自己創建的數據線程,則需要創建該線程的內存池6.When retain count increase?什麼時候內存計數會增加?答案:見iOS面試題(一)7.What are commonly used NSObject class methods?類NSObject的那些方法經常被使用?答案:NSObject是Objetive-C的基類,其由NSObject類及一系列協議構成。其中類方法alloc、class、 description 對象方法init、dealloc、–performSelector:withObject:afterDelay:等經常被使用8.What is convenience constructor?什麼是簡便構造方法?答案:簡便構造方法一般由CocoaTouch框架提供,如NSNumber的+numberWithBool:+numberWithChar:+numberWithDouble:+numberWithFloat:+numberWithInt:Foundation下大部分類均有簡便構造方法,我們可以通過簡便構造方法,獲得系統給我們創建好的對象,並且不需要手動釋放。9.How to design universal application in Xcode?如何使用Xcode設計通用應用?答案:使用MVC模式設計應用,其中Model層完成脫離界面,即在Model層,其是可運行在任何設備上,在controller層,根據iPhone與iPad(獨有UISplitViewController)的不同特點選擇不同的viewController對象。在View層,可根據現實要求,來設計,其中以xib文件設計時,其設置其為universal。10.What is keyword atomic in Objective C?在Objetive-C什麼時原子關鍵字答案:atomic,nonatomic見iOS面試題(一)11.What are UIView animations?UIView的動畫效果有那些?答案:有很多,如UIViewAnimationOptionCurveEaseInOut UIViewAnimationOptionCurveEaseIn UIViewAnimationOptionCurveEaseOut UIViewAnimationOptionTransitionFlipFromLeft UIViewAnimationOptionTransitionFlipFromRight UIViewAnimationOptionTransitionCurlUpUIViewAnimationOptionTransitionCurlDown如何使用可見該博文12.How can you store data in iPhone applications?在iPhone應用中如何保存數據?答案:有以下幾種保存機制:1.通過web服務,保存在伺服器上2.通過NSCoder固化機制,將對象保存在文件中3.通過SQlite或CoreData保存在文件資料庫中13.What is coredata?什麼是coredata?答案:coredata框架是apple提供的一套通用自動的解決方案,包括了對象生存周期、對象關係圖、持久化機制。補充答案:上面是翻譯的,按我個人理解coredata提供一種一機制,讓我們可以方便的把內存中對象,及對象間的關係,映射到coredata,然後由它為我們持久化數據。相比普通的文件資料庫SQlite,它的功能更強大,不需要我們先將對象數據format成SQL語句,存入資料庫,再用select語句讀出,而現在是從內存到coredata的數據管理,我們只需管理coredata的managed對象。是蘋果提供一套數據保存14.What is NSManagedObject model?什麼是NSManagedObject模型?答案:NSManagedObject是NSObject的子類 ,也是coredata的重要組成部分,它是一個通用的類,實現了core data 模型層所需的基本功能,用戶可通過子類化NSManagedObject,建立自己的數據模型。15.What is NSManagedobjectContext?什麼是NSManagedobjectContext?答案:NSManagedobjectContext對象負責應用和資料庫之間的交互。16.What is predicate?什麼是謂詞?答案:謂詞是通過NSPredicate,是通過給定的邏輯條件作為約束條件,完成對數據的篩選。predicate = [NSPredicate predicateWithFormat:@"customerID == %d",n];a = [customers filteredArrayUsingPredicate:predicate];17.What kind of persistence store we can use with coredata?coredata有哪幾種持久化存儲機制?答案:coredatat提供以下幾種存儲機制:XML(iOS系統不支持),自動存儲,SQLite,內存存儲。補充說明:這個問題問的是,coredate框架的存儲機制,平時使用coredata時,更多關注的是managed的對象,這裡是coerdata框架的存儲實現細節。BTW: 其他常用的持久化存儲方法 :存入到文件、存入到NSUserDefaults(系統plist文件中)。===================1 談談對Block 的理解?並寫出一個使用Block執行UIVew動畫?答案:Block是可以獲取其他函數局部變數的匿名函數,其不但方便開發,並且可以大幅提高應用的執行效率(多核心CPU可直接處理Block指令)[cpp]view plaincopyprint?
[UIViewtransitionWithView:self.viewduration:0.2options:UIViewAnimationOptionTransitionFlipFromLeftanimations:^{[[blueViewControllerview]removeFromSuperview];[[selfview]insertSubview:yellowViewController.viewatIndex:0];}completion:NULL];2 寫出上面代碼的Block的定義。答案:typedef void(^animations) (void);typedef void(^completion) (BOOL finished);3 試著使用+beginAnimations:context:以及上述Block的定義,寫出一個可以完成+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);操作的函數執行部分答案:無網路部分3 做過的項目是否涉及網路訪問功能,使用什麼對象完成網路功能?答案:ASIHTTPRequest與NSURLConnection4 簡單介紹下NSURLConnection類及+sendSynchronousRequest:returningResponse:error:與–initWithRequest:delegate:兩個方法的區別?答案: NSURLConnection主要用於網路訪問,其中+sendSynchronousRequest:returningResponse:error:是同步訪問數據,即當前線程會阻塞,並等待request的返回的response,而–initWithRequest:delegate:使用的是非同步載入,當其完成網路訪問後,會通過delegate回到主線程,並其委託的對象。多線程部分============1 什麼是block對於閉包(block),有很多定義,其中閉包就是能夠讀取其它函數內部變數的函數,這個定義即接近本質又較好理解。對於剛接觸Block的同學,會覺得有些繞,因為我們習慣寫這樣的程序main(){ funA();} funA(){funB();} funB(){.....}; 就是函數main調用函數A,函數A調用函數B... 函數們依次順序執行,但現實中不全是這樣的,例如項目經理M,手下有3個程序員A、B、C,當他給程序員A安排實現功能F1時,他並不等著A完成之後,再去安排B去實現F2,而是安排給A功能F1,B功能F2,C功能F3,然後可能去寫技術文檔,而當A遇到問題時,他會來找項目經理M,當B做完時,會通知M,這就是一個非同步執行的例子。在這種情形下,Block便可大顯身手,因為在項目經理M,給A安排工作時,同時會告訴A若果遇到困難,如何能找到他報告問題(例如打他手機號),這就是項目經理M給A的一個回調介面,要回掉的操作,比如接到電話,百度查詢後,返回網頁內容給A,這就是一個Block,在M交待工作時,已經定義好,並且取得了F1的任務號(局部變數),卻是在當A遇到問題時,才調用執行,跨函數在項目經理M查詢百度,獲得結果後回調該block。2 block 實現原理Objective-C是對C語言的擴展,block的實現是基於指針和函數指針。從計算語言的發展,最早的goto,高級語言的指針,到面向對象語言的block,從機器的思維,一步步接近人的思維,以方便開發人員更為高效、直接的描述出現實的邏輯(需求)。下面是兩篇很好的介紹block實現的博文iOS中block實現的探究談Objective-C Block的實現3 block的使用使用實例cocoaTouch框架下動畫效果的Block的調用使用typed聲明blocktypedef void(^didFinishBlock) (NSObject *ob);這就聲明了一個didFinishBlock類型的block,然後便可用@property (nonatomic,copy) didFinishBlock finishBlock;聲明一個block對象,注意對象屬性設置為copy,接到block 參數時,便會自動複製一份。__block是一種特殊類型,使用該關鍵字聲明的局部變數,可以被block所改變,並且其在原函數中的值會被改變。4 常見系列面試題面試時,面試官會先問一些,是否了解block,是否使用過block,這些問題相當於開場白,往往是下面一系列問題的開始,所以一定要如實根據自己的情況回答。1 使用block和使用delegate完成委託模式有什麼優點?首先要了解什麼是委託模式,委託模式在iOS中大量應用,其在設計模式中是適配器模式中的對象適配器,Objective-C中使用id類型指向一切對象,使委託模式更為簡潔。了解委託模式的細節:iOS設計模式----委託模式使用block實現委託模式,其優點是回調的block代碼塊定義在委託對象函數內部,使代碼更為緊湊;適配對象不再需要實現具體某個protocol,代碼更為簡潔。2 多線程與blockGCD與Block使用 dispatch_async系列方法,可以以指定的方式執行blockGCD編程實例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();});===============1 什麼是block對於閉包(block),有很多定義,其中閉包就是能夠讀取其它函數內部變數的函數,這個定義即接近本質又較好理解。對於剛接觸Block的同學,會覺得有些繞,因為我們習慣寫這樣的程序main(){ funA();} funA(){funB();} funB(){.....}; 就是函數main調用函數A,函數A調用函數B... 函數們依次順序執行,但現實中不全是這樣的,例如項目經理M,手下有3個程序員A、B、C,當他給程序員A安排實現功能F1時,他並不等著A完成之後,再去安排B去實現F2,而是安排給A功能F1,B功能F2,C功能F3,然後可能去寫技術文檔,而當A遇到問題時,他會來找項目經理M,當B做完時,會通知M,這就是一個非同步執行的例子。在這種情形下,Block便可大顯身手,因為在項目經理M,給A安排工作時,同時會告訴A若果遇到困難,如何能找到他報告問題(例如打他手機號),這就是項目經理M給A的一個回調介面,要回掉的操作,比如接到電話,百度查詢後,返回網頁內容給A,這就是一個Block,在M交待工作時,已經定義好,並且取得了F1的任務號(局部變數),卻是在當A遇到問題時,才調用執行,跨函數在項目經理M查詢百度,獲得結果後回調該block。2 block 實現原理Objective-C是對C語言的擴展,block的實現是基於指針和函數指針。從計算語言的發展,最早的goto,高級語言的指針,到面向對象語言的block,從機器的思維,一步步接近人的思維,以方便開發人員更為高效、直接的描述出現實的邏輯(需求)。下面是兩篇很好的介紹block實現的博文iOS中block實現的探究談Objective-C Block的實現3 block的使用使用實例cocoaTouch框架下動畫效果的Block的調用使用typed聲明blocktypedef void(^didFinishBlock) (NSObject *ob);這就聲明了一個didFinishBlock類型的block,然後便可用@property (nonatomic,copy) didFinishBlock finishBlock;聲明一個block對象,注意對象屬性設置為copy,接到block 參數時,便會自動複製一份。__block是一種特殊類型,使用該關鍵字聲明的局部變數,可以被block所改變,並且其在原函數中的值會被改變。4 常見系列面試題面試時,面試官會先問一些,是否了解block,是否使用過block,這些問題相當於開場白,往往是下面一系列問題的開始,所以一定要如實根據自己的情況回答。1 使用block和使用delegate完成委託模式有什麼優點?首先要了解什麼是委託模式,委託模式在iOS中大量應用,其在設計模式中是適配器模式中的對象適配器,Objective-C中使用id類型指向一切對象,使委託模式更為簡潔。了解委託模式的細節:iOS設計模式----委託模式使用block實現委託模式,其優點是回調的block代碼塊定義在委託對象函數內部,使代碼更為緊湊;適配對象不再需要實現具體某個protocol,代碼更為簡潔。2 多線程與blockGCD與Block使用 dispatch_async系列方法,可以以指定的方式執行blockGCD編程實例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();});
推薦閱讀:
※面試歸來
※職場面試 誠信也得講點「技巧」
※為什麼我的面試總是失敗?
※面試對策(一)
※日本面試注意事項詳解【問答篇】
TAG:面試 |