iOS面試題java
1.Difference between shallow copy and deep copy?程序員
淺複製和深複製的區別?web
淺層複製:指向對象的指針,而不復制引用對象自己。深層複製:複製引用對象自己。面試
2.What is advantage of categories? What is difference between implementing a category and inheritance?shell
類別的做用?繼承和類別在實現中有何區別?數據庫
category能夠在不熟悉,不改變原來代碼的狀況下往裏面添加新的方法,只能添加,不能刪除修改。而且若是類別和原來類中的方法名稱衝突,則類別將覆蓋原來的方法,由於類別具備更高的優先級。編程
類別主要有3個做用:設計模式
(1)將類的實現分散到多個不一樣文件或多個不一樣框架中。數組
(2)建立對私有方法的前向引用。安全
(3)向對象添加非正式協議。
繼承能夠添加,修改或刪除方法,而且能夠增長屬性。
3.Difference between categories and extensions?
類別和類擴展的區別。
categories和extensions的不一樣在於後者能夠添加屬性。另外後者添加的方法是必需要實現的。
extensions能夠認爲是一個私有的categories。
4.Difference between protocol in objective c and interfaces in Java?
obc中的協議和java中得接口概念有何不一樣?
obc中的代理有2層含義,官方定義爲formal和informal protocol。前者和Java接口同樣。
informal protocol中的方法屬於設計模式考慮範疇,不是必須實現的,可是若是有實現,就會改變類的屬性。如今協議有2個修飾詞:」必須實現(@requied)「和」可選實現(@optional)「。
5.What are KVO and KVC?
kvc:鍵值編碼是一種間接訪問對象的屬性使用字符串來標識屬性,而不是經過調用存取方法,直接或經過實例變量訪問的機制。不少狀況下能夠簡化程序代碼。
kvo:鍵值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。
6.What is purpose of delegates?
代理的做用?
代理的目的是改變或傳遞控制鏈。容許一個類在某些特定時刻通知到其餘類,而不須要獲取到那些類的指針。能夠減小框架複雜度,代理能夠理解爲Java中的回調監聽機制的一種相似。
7.What are mutable and immutable types in Objective C?
obc中可修改和不可修改的類型。
簡單理解就是可動態添加修改和不可動態添加修改同樣。好比NSArray和NSMutableArray。
8.When we call objective c is runtime language what does it mean?
咱們說的obc時動態運行時語言是什麼意思?
主要是將數據類型的肯定由編譯時推遲到運行時。
運行時機制使咱們直到運行時纔去決定一個對象的類別,以及調用該類別對象指定方法。
多態:不一樣對象以本身的方式響應相同的消息的能力叫作多態。
9.What is difference between NSNotification and protocol?
通知和協議的不一樣之處?
協議有控制鏈的關係,通知沒有。通知一對多,代理則對象不用所作的事情不一樣。通知只負責發出。
10.What is push notification?
什麼是消息推送?
推送是一個技術,獲取資源的手段。
11.Ploymorphism?
關於多態性?
多態,子類指針能夠賦值給父類。
12.Singleton?
對於單例的理解?
答案:保證在內存中擁有隻有類的單個實例
13.如何在多線程訪問單例時的安全性
答案:
14.What is responder chain?
響應鏈
事件響應鏈,包括點擊事件,畫面刷新事件等。在視圖棧內從上至下,或者從下至上傳播。
15.Difference between frame and bounds?
frame是以父控件左上角爲座標原點,bounds是以自身爲原點。
16.Difference between method and selector?
方法和選擇器有何不一樣?
selector是一個方法的名字,method是一個組合體,包含了名字和實現。
17.Is there any garbage collection mechanism in Objective C?
obc的垃圾回收機制?
obc2.0有Garbage collection,可是iOS平臺不提供。obc通常都是手動管理內存但也有自動釋放池。
18.NSOperation queue?
存放NSOperation的集合類。
操做和操做隊列,基本能夠當作Java中的線程和線程池的概念。用於處理iOS多線程開發的問題。
19.What is lazy loading?
用到時才初始化,延遲加載。
延時加載能夠避免內存太高,異步加載能夠避免線程堵塞。
20.Can we use two tableview controllers on one viewcontroller?
是否能在一個視圖控制器中嵌入兩個tableview控制器?
一個試圖控制只提供了一個view試圖,有的能例如TabBarController。
21.Can we use one tableview with two different datasources?How you will achieve this?
一個tableview是否能夠關聯兩個不一樣的數據源?你會怎麼處理?
不解。
22.Objective C的類能夠多重繼承麼?能夠實現多個接口麼?重寫一個類的方式用繼承仍是分類好?爲何?
obc只支持單繼承,能夠實現多個接口,若是要實現多繼承的話,能夠經過類別和協議的方式來實現。通常狀況下用分類好,用category重寫類的方法,僅對本category有效,不會影響其餘類和原有類的關係。
23.#import跟#include有什麼區別,@class,@import<>跟@import」「有什麼區別?
#import是Objective C導入頭文件的關鍵字,#include是C/C++導入頭文件的關鍵字,使用#import頭文件會自動導入一次,不會重複導入,至關於#include和#pragma once;@class告訴編譯器某個類的聲明,當執行時,纔去查看類的實現文件,能夠解決頭文件的相互包含;#import<>用來包含系統的頭文件,#import」「用來包含用戶頭文件。
24.屬性readwrite,readonly,assign,retain,copy,nonatomic各是什麼做用,在哪一種狀況下用?
readwrite是可讀可寫特性,須要生成getter方法和setter方法。
readonly是隻讀特性,只會生成getter方法,不但願屬性在類外改變。
assign是賦值特性,setter方法將傳入參數賦值給實例變量。
retain表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1。
copy表示賦值特性,setter方法將傳入對象複製一份,須要徹底一份新的變量。
nonatomic非原子操做,決定編譯器生成的setter,getter是不是原子操做。
atomic表示多線程安全,通常使用nonatomic。
25.類變量的@protected,@private,@public,@package聲明各有什麼含義?
26.id聲明的對象有什麼特性?
id聲明的對象具備運行時的特性,便可以指向任意類型的obc的對象。
27.MVC?特性?爲何被普遍運用?
MVC設計模式包括:Model,View,Controller。相互之間的連接使之更加面向對象。
28.對於語句NSString *str =[ [NSData alloc] init];str在編譯和運行時分別是什麼類型的對象?
編譯是NSString,運行是NSData。
29.for(int index = 0; index < 20; index++ ){
NSString *str = @「temp」;
NSLog(temp);
NSNumber *num = [NSNumber numberWithInt:2];
NSLog(num);
}
這段代碼有什麼問題?會不會形成內存泄露(多線程)?在內存緊張的設備上作大循環時自動釋放池是寫在循環內仍是循環外好?爲何?
30.內存管理的幾條原則是什麼?按照默認法則,那些關鍵字生成的對象須要手動釋放?在和prpperty結合的時候怎樣有效的避免內存泄露?
誰申請,誰釋放。遵循Cocoa Touch的使用原則;
內存管理主要要避免「過早釋放」和「內存泄漏」,對於「過早釋放」須要注意@property設置特性時,必定要用對特性關鍵字,對於「內存泄漏」,必定要申請了要負責釋放,要細心。
關鍵字alloc 或new 生成的對象須要手動釋放;
設置正確的property屬性,對於retain須要在合適的地方釋放,
31.在一個對象釋放前,若是他被加到了notificationCenter中,不在notificationCenter中remove這個對象可能會出現什麼問題?
32.怎樣實現一個singleton的類,給出思路。
33.什麼是序列化或者Acrchiving,能夠用來作什麼,怎樣與copy結合,原理是什麼?
34.線程與進程的區別和聯繫?
進程和線程都是由操做系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性。進程和線程的主要差異在於它們是不一樣的操做系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不一樣執行路徑。線程有本身的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個線程死掉,因此多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行而且又要共享某些變量的併發操做,只能用線程不用進程。
35.runloop是什麼?在主線程中的某個函數裏調用了異步函數,怎麼樣block當前線程,且還能響應當前線程的timer事件,touch事件等。
36.iOS平臺怎麼作數據的持久化?CoreData和SQLite有無必然聯繫?CoreData是一個關係型數據庫嗎?
iOS中能夠有四種持久化數據的方式:屬性列表、對象歸檔、SQLite3和CoreData;CoreData能夠是你以圖形界面的方式快速的定義App的數據模型,同時在你的代碼中容易獲取到它。CoreData提供了基礎結構去處理經常使用的功能,例如保存,恢復,撤銷和重作。容許你再App中繼續建立新的任務。在使用CoreData的時候,你不用安裝額外的數據庫系統,由於CoreData使用內置的SQLite數據庫。CoreData將你的App的模型層放入到一組定義在內存中的數據對象,CoreData會追蹤這些對象的改變,同時能夠根據須要作出相反的改變,例如用戶執行撤銷命令。當CoreData在對你App數據的改變進行保存的時候,CoreData會把這些數據歸檔,並永久性保存。Mac OS X中SQLite庫,它是一個輕量級功能強大的關係數據引擎,也很容易嵌入到應用程序。能夠在多個平臺使用,SQLite是一個輕量級的嵌入式數據庫編程。與CoreData框架不一樣的時,SQLite是使用程序式的,SQL的只要的API來直接操做數據表。CoreData不是一個關係型數據庫,也不是關係型數據庫管理系統。雖然CoreData支持SQLite做爲一個存儲類型,但它不能使用任意的SQLite數據庫。CoreData在使用的過程當中本身建立這個數據庫。CoreData支持對一,對多的關係。
37.闡述一個nil對象從interface builder產生,到載入程序運行空間,最後被釋放時所經歷的生命週期。
38.UNIX上進程怎麼通訊?
UNIX主要支持三種通訊方式:
1).基本通訊:主要用來協調進程間的同步和互斥
(1)鎖文件通訊
通訊的雙方經過查找特性目錄下特定類型的文件(稱鎖文件)來完成進程間對臨界資源訪問時的互斥;例如進程p1訪問一個臨界資源,首先查看是否有一個特性類型文件,如有則等待一段時間再查找鎖文件。
(2)記錄鎖文件
2).管道通訊:適應大批量的數據傳遞
3).IPC:適應大批量的數據傳遞
38.Timer的間隔週期準嗎?怎樣實現一個精準的Timer?
39.UIScrollView用到了什麼設計模式?還能在foundation庫中找到相似的嗎?
40.若是要開發一個相似eclipse的軟件,支持插件結構。且開放給第三方開發。你會怎麼設計?
41.main()
{
int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a + 1);
printf(「%d,%d」,*(a + 1),*(ptr - 1));
}
2-5
*(a + 1)= a[1]; *(ptr - 1) = a[4];
&a是數組指針,其類型爲int(*)[5];而指針加1要根據指針類型加上必定的值,不一樣類型的指針+1以後增長的大小不一樣。a是長度爲5的int數組指針,因此要加5*sizeof(int)因此實際是a[5],可是prt與(&a + 1)類型是不同的,因此prt - 1只會減去sizeof(int*),a,&a的地址是同樣的,但意思不同,a是數組首地址,也是a[0]的地址,&a是對象首地址,a + 1是數組下一元素的地址,即a[1],&a + 1是下一個對象的地址,即a[5]。
41.列舉幾種進程的同步機制,並比較其優缺點。
原子操做信號量機制自旋鎖管理,會合,分佈式系統
42.進程之間通訊的途徑
共享存儲系統消息傳遞系統管道:以文件系統爲基礎。
43.進程死鎖的緣由
資源競爭及進程推動順序非法。
44.死鎖的四個必要條件。
互斥、請求保持、不可剝奪、環路。
45.死鎖的處理
鴕鳥策略、預防策略、避免策略、檢測與解除死鎖
46.堆和棧的區別?
管理方式:對於棧來說,是由編譯器自動管理,無需咱們手工控制;對於堆來講,釋放工做由程序員控制,容易產生memoryleak。
碎片問題:對於堆來說,頻繁的new/delete勢必會形成內存空間的不連續,從而形成大量的碎片,使程序效率下降。對於棧來說,則不會存在這個問題,由於棧是先進後出的隊列,他們是如此的—對應,以致於永遠都不可能有一個內存塊從棧中彈出。
分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有兩種分配方式:靜態和動態分配。靜態是編譯器完成的,好比局部變量的分配。動態有alloc?函數進行分配,可是棧的動態分配和堆是不一樣的,他的動態是由編譯器進行釋放,無需咱們手動實現。
分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持;分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的。它的機制是很複雜的。
47.C和Obj-C如何混用
1)Obj-C的編譯器處理後綴爲m的文件時,能夠識別Obj-C和C的代碼,處理mm文件能夠識別Obj-C,C,C++代碼,但cpp文件必須只能用C/C++代碼,並且cpp文件include的頭文件中,也不能出現Obj-C的代碼,由於cpp只是cpp
2)在mm文件中混用cpp直接使用便可,因此Obj-C混cpp不是問題
3)在cpp中混用Obj-C其實就是使用Obj-C編寫的模塊是咱們想要的。
模塊以類實現,那要按照cpp class的標準寫類的定義,頭文件中不能出現Obj-C的東西,包括#import cocoa。類的實現代碼中可使用Obj-C的東西,能夠import,只是後綴是mm。
若是模塊以函數實現,那麼頭文件要按C
的格式聲明函數,實現文件中,C++函數內部能夠用得Obj-C,但後綴仍是mm或m。
總結:只要cpp文件和cpp include的文件中不包含Obj-C的東西就能夠用了,cpp混用Obj-C的關鍵是使用接口,而不能直接使用實現代碼,實際上cpp混用的時Obj-C編譯後的文件,這個東西實際上是無差異的,因此能夠用,Obj-C的編譯器支持cpp。
48.目標-動做機制
目標是動做消息的接受者。一個控件,或者更爲常見的時它的單元,以插座變量的形式保有其動做消息的目標。
動做是控件發送給目標的消息,或者從目標的角度看,它使目標爲了響應動做而實現的方法,程序須要某些機制來進行事件和指令的翻譯,這個機制就是目標-動做機制。
49.cocoatouch框架
iPhoneOS 應用程序的基礎Cocoa Touch 框架重用了許多 Mac 系統的成熟模式,可是它更多地專一於觸摸的接口和優化。UIKit 爲您提供了在 iPhone OS 上實現圖形,事件驅動程序的基本工具,其創建在和 Mac OS X 中同樣的 Foundation 框架上,包括文件處理,網絡,字符串操做等。
CocoaTouch 具備和 iPhone 用戶接口一致的特殊設計。有了 UIKit,您可使用 iPhone OS 上的獨特的圖形接口控件,按鈕,以及全屏視圖的功能,您還可使用加速儀和多點觸摸手勢來控制您的應用。
各色俱全的框架 除了UIKit 外,Cocoa Touch 包含了建立世界一流iPhone 應用程序須要的全部框架,從三維圖形,到專業音效,甚至提供設備訪問 API 以控制攝像頭,或經過 GPS 獲知當前位置。Cocoa Touch 既包含只須要幾行代碼就能夠完成所有任務的強大的 Objective-C 框架,也在須要時提供基礎的 C 語言 API 來直接訪問系統。這些框架包括:
CoreAnimation
經過 CoreAnimation,您就能夠經過一個基於組合獨立圖層的簡單的編程模型來建立豐富的用戶體驗。
CoreAudio
CoreAudio 是播放,處理和錄製音頻的專業技術,可以輕鬆爲您的應用程序添增強大的音頻功能。
CoreData提供了一個面向對象的數據管理解決方案,它易於使用和理解,甚至可處理任何應用或大或小的數據模型。
功能列表:框架分類
下面是 CocoaTouch 中一小部分可用的框架:
• 音頻和視頻
• Core Audio
• OpenAL
• Media Library
• AV Foundation
• 數據管理
• Core Data
• SQLite
• 圖形和動畫
• Core Animation
• OpenGL ES
• Quartz 2D
• 網絡/li>
• Bonjour
• WebKit
• BSD Sockets
• 用戶應用
• Address Book
• Core Location
• Map Kit
• Store Kit
50.Obj-C的內存管理
若是你拷貝一個對象,你也擁有拷貝獲得的對象,須要負責該對象的釋放
若是你保持一個對象,你就部分擁有這個對象,須要在再也不使用時候釋放對象
51.自動釋放池是什麼,如何工做
當你向一個對象發送一個autorerelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。他仍然是正當的對象,所以自動釋放池定義的做用域內的其餘對象能夠向他發送消息,當程序執行到做用域結束的位置時,自動釋放池就會被釋放,池中的全部對象也就被釋放。
autorelease和release在引用計數減一的時機不一樣,autorelease會在對象的使用結束才作計數減一。
52.類工廠方法
類工廠方法的實現是爲了向客戶提供方便,它們將分配和初始化合在一個步驟中,返回被建立的對象,並進行自動釋放處理。另外一個目的是使類提供單件實例。
53.單件實例是什麼?
Foundation和Application Kit 框架中得一些類只容許建立單件對象,即這些類在當前進程中得惟一實例。
54.動態綁定—在運行時肯定要調用的方法
動態綁定將調用方法的肯定也推遲到運行時。在編譯時,方法的調用並不和代碼綁定在一塊兒,只有在消實發送出來以後,才肯定被調用的代碼。經過動態類型和動態綁定技術,您的代碼每次執行均可以獲得不一樣的結果。運行時因子負責肯定消息的接 收者和被調用的方法。運行時的消息分發機制爲動態綁定提供支持。當您向一個動態類型肯定了的對象發送消息時,運行環境系統會經過接收者的isa指針定位對象的類,並以此爲起點肯定被調用的方法,方法和消息是動態綁定的。並且,您沒必要在Objective-C 代碼中作任何工做,就能夠自動獲取動態綁定的好處。您在每次發送消息時,
特別是當消息的接收者是動態類型已經肯定的對象時,動態綁定就會例行而 透明地發生。
55.obj-c的優缺點
objc優勢:
1)Cateogies
2) Posing
3) 動態識別
4) 指標計算
5)彈性訊息傳遞
6) 不是一個過分複雜的 C 衍生語言
7) Objective-C 與 C++ 可混合編程
缺點:
1)不支援命名空間
2)不支持運算符重載
3)不支持多重繼承
4)使用動態運行時類型,全部的方法都是函數調用,因此不少編譯時優化方法都用不到。(如內聯函數等),性能低劣。
56.ViewController的 didReceiveMemoryWarning 是在何時被調用的?
默認調用[superdidReceiveMemoryWarning]
57.談談你對ARC 的認識和理解?
58. ObjC中,與alloc語義相反的方法是dealloc仍是release?與retain語義相反的方法是dealloc仍是release,爲何?須要與alloc配對使用的方法是dealloc仍是release,爲何?
alloc與dealloc語意相反,alloc是建立變量,dealloc是釋放變量。 retain 對應release,retain 保留一個對象。調用以後,變量的計數加1。或許不是很明顯,在這有例爲證:
- (void)setName : (NSString*) name {
[name retain];
[myname release];
myname = name; }
咱們來解釋一下:設想,用戶在調用這個函數的時候,他注意了內存的管理,因此他當心的寫了以下代碼:
NSString* newname = [[NSString alloc] initWithString: @"John"];
[aClasssetName: newname];
[newnamerelease];
咱們來看一看newname的計數是怎麼變化的。首先,它被alloc,count = 1; 而後,在setName中,它被retain,count = 2; 最後,用戶本身釋放newname,count= 1,myname指向了newname。這也解釋了爲何須要調用[myname release]。咱們須要在給myname賦新值的時候,釋放掉之前老的變量。retain 以後直接dealloc對象計數器沒有釋放。alloc 須要與release配對使用,由於alloc 這個函數調用以後,變量的計數加1。因此在調用alloc 以後,必定要調用對應的release。另外,在release一個變量以後,他的值仍然有效,因此最好是後面緊接着再var = nil。
59. 在一個對象的方法裏面:
self.name<http://self.name/> = 「object」;
和
name =」object」
有什麼不一樣?
60. 這段代碼有什麼問題:
@implementation Person
- (void)setAge:(int)newAge {
self.age = newAge;
}
@end
61. 什麼是retaincount?
62. 爲何不少內置類如UITableViewController的delegate屬性都是assign而不是retain的?
63. 定義屬性時,什麼狀況使用copy,assign,和retain?
assign用於簡單數據類型,如NSInteger,double,bool,retain和copy用戶對象,copy用於當 a指向一個對象,b也想指向一樣的對象的時候,若是用assign,a若是釋放,再調用b會crash,若是用copy 的方式,a和b各自有本身的內存,就能夠解決這個問題。retain 會使計數器加一,也能夠解決assign的問題。另外:atomic和nonatomic用來決定編譯器生成的getter和setter是否爲原子操做。在多線程環境下,原子操做是必要的,不然有可能引發錯誤的結果。
64. autorelease的對象是在何時被release的?
autorelease實際上只是把對release的調用延遲了,對於每個Autorelease,系統只是把該Object放入了當前的 Autoreleasepool中,當該pool被釋放時,該pool中的全部Object會被調用Release。對於每個Runloop,系統會隱式建立一個Autoreleasepool,這樣全部的releasepool會構成一個象CallStack同樣的一個棧式結構,在每個 Runloop結束時,當前棧頂的Autoreleasepool會被銷燬,這樣這個pool裏的每一個Object(就是autorelease的對象)會被release。那什麼是一個Runloop呢?一個UI事件,Timer call,delegate call, 都會是一個新的Runloop。那什麼是一個Runloop呢?一個UI事件,Timer call,delegate call, 都會是一個新的Runloop。
65. 這段代碼有什麼問題,如何修改
for (int i = 0; i < someLargeNumber; i++)
{
NSString *string = @」Abc」;
string = [string lowercaseString];
string = [stringstringByAppendingString:@"xyz"];
NSLog(@「%@」, string);
}
66. Objective C中的protocal是什麼?
@protocal obj裏面的協議就如同java裏面的interface。
67. Objective C中的selector 是什麼?
你能夠理解 @selector()就是取類方法的編號,他的行爲基本能夠等同C語言的中函數指針,只不過C語言中,能夠把函數名直接賦給一個函數指針,而 Objective-C的類不能直接應用函數指針,這樣只能作一個@selector語法來取.它的結果是一個SEL類型。這個類型本質是類方法的編號 (函數地址)。
68. ViewController 的 loadView,viewDidLoad, viewDidUnload 分別是在何時調用的?在自定義ViewController的時候這幾個函數裏面應該作什麼工做?
viewDidLoad在view 從nib文件初始化時調用,loadView在controller的view爲nil時調用。此方法在編程實現view時調用,view 控制器默認會註冊memory warning notification,當view controller的任何view 沒有用的時候,viewDidUnload會被調用,在這裏實現將retain 的view release,若是是retain的IBOutlet view 屬性則不要在這裏release,IBOutlet會負責release 。
69. UITableViewController 中,建立UITableViewCell時,initWithSytle:resuseIdentifier中,reuseIdentifier有什麼用?簡述UITableViewCell的複用原理.
複用隊列的元素增長:只有在cell被滑動出界面的時候,此cell纔會被加入到複用隊列中。每次在建立cell的時候,程序會首先經過調用 dequeueReusableCellWithIdentifier:cellType方法,到複用隊列中去尋找標示符爲「cellType」的 cell,若是找不到,返回nil,而後程序去經過調用[[[UITableViewCell alloc]initWithStyle:style reuseIdentifier:cellType] autorelease]來建立標示符爲「cellType」的cell。
70. UIView 和CALayer 有什麼區別?
二者最大的區別是,圖層不會直接渲染到屏幕上。
71.iOS上的多線程
GCD是(Grand Central Dispatch)的縮寫 ,從系統級別提供的一個易用地多線程類庫,具備運行時的特色,能充分利用多核心硬件。GCD的API接口爲C語言的函數,函數參數中多數有Block,爲咱們提供強大的「接口」,
NSOperation與Queue
NSOperation是一個抽象類,它封裝了線程的細節實現,咱們能夠經過子類化該對象,加上NSQueue來同面向對象的思惟,管理多線程程序。
NSThread
NSThread是一個控制線程執行的對象,它不如NSOperation抽象,經過它咱們能夠方便的獲得一個線程,並控制它。但NSThread的線程之間的併發控制,是須要咱們本身來控制的,能夠經過NSCondition實現。
在項目何時選擇使用GCD,何時選擇NSOperation?
項目中使用NSOperation的優勢是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程序結構更好,子類化NSOperation的設計思路,是具備面向對象的優勢(複用、封裝),使得實現是多線程支持,而接口簡單,建議在複雜項目中使用。
項目中使用GCD的優勢是GCD自己很是簡單、易用,對於不復雜的多線程操做,會節省代碼量,而Block參數的使用,會是代碼更爲易讀,建議在簡單項目中使用。
72.Objective-C如何對內存管理的,說說你的見解和解決方法?
Objective-C的內存管理主要有三種方式ARC(自動內存計數)、手動內存計數、內存池。
73.如何對iOS設備進行性能測試?
Profile-> Instruments ->Time Profiler
74.What are commonly used NSObject class methods?
類NSObject的那些方法常常被使用?
NSObject是Objetive-C的基類,其由NSObject類及一系列協議構成。
其中類方法alloc、class、 description 對象方法init、dealloc、– performSelector:withObject:afterDelay:等常常被使用
75..What is convenience constructor?
什麼是簡便構造方法?
簡便構造方法通常由CocoaTouch框架提供,如NSNumber的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt:
Foundation下大部分類均有簡便構造方法,咱們能夠經過簡便構造方法,得到系統給咱們建立好的對象,而且不須要手動釋放。
76.How can you store data in iPhone applications?
在iPhone應用中如何保存數據?
有如下幾種保存機制:
1.經過web服務,保存在服務器上
2.經過NSCoder固化機制,將對象保存在文件中
3.經過SQlite或CoreData保存在文件數據庫中
77.What is coredata?
什麼是coredata?
coredata是蘋果提供一套數據保存框架,其基於SQlite
78.What is NSManagedObject model?
什麼是NSManagedObject模型?
NSManagedObject是NSObject的子類 ,也是coredata的重要組成部分,它是一個通用的類,實現了core data 模型層所需的基本功能,用戶可經過子類化NSManagedObject,創建本身的數據模型。
79.What is NSManagedobjectContext?
什麼是NSManagedobjectContext?
NSManagedobjectContext對象負責應用和數據庫之間的交互。
80.What is predicate?什麼是謂詞?
謂詞是經過NSPredicate,是經過給定的邏輯條件做爲約束條件,完成對數據的篩選。
predicate = [NSPredicate predicateWithFormat:@"customerID == %d",n];
a = [customers filteredArrayUsingPredicate:predicate];
81.作過的項目是否涉及網絡訪問功能,使用什麼對象完成網絡功能?
ASIHTTPRequest與NSURLConnection
82.簡單介紹下NSURLConnection類及+ sendSynchronousRequest:returningResponse:error:與– initWithRequest:delegate:兩個方法的區別?
NSURLConnection主要用於網絡訪問,其中+ sendSynchronousRequest:returningResponse:error:是同步訪問數據,即當前線程會阻塞,並等待request的返回的response,而– initWithRequest:delegate:使用的是異步加載,當其完成網絡訪問後,會經過delegate回到主線程,並其委託的對象。
83.block的使用
使用實例
使用typed聲明block
typedef void(^didFinishBlock) (NSObject *ob);
這就聲明瞭一個didFinishBlock類型的block,
而後即可用
@property (nonatomic,copy) didFinishBlock finishBlock;
聲明一個blokc對象,注意對象屬性設置爲copy,接到block 參數時,便會自動複製一份。
__block是一種特殊類型,
使用該關鍵字聲明的局部變量,能夠被block所改變,而且其在原函數中的值會被改變。
84.多線程與block
GCD與Block
使用 dispatch_async 系列方法,能夠以指定的方式執行block
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();});
85.App出現內存泄露時,如何追蹤和解決的?
86.編寫一段程序,計算數字的總和且打印數字的英文單詞,例如12343,計算13,打印「one,two,three,four,three」。接受任意輸入。
87.根據下面的定義
float f = 1.00;
short int i = 100;
long int l = 500L;
double d = 15.00;
肯定下面的結果值和類型:
f + i;
l / d;
i / l + f;
l * i;
f / 2;
i / (d + f);
l / (i * 2.0);
l + i/(double)l;
88.編寫一個名爲IS_UPPER_CASE的宏,其做用若是字符是大寫字母,就給出非零的值。
89.編寫一個程序來替代shell裏的ls命令。
90.NSTimer是不是多線程的?使用時是否要加同步鎖?
91.通常在哪一個函數中建立某個View的子View。
92.Objective C中Category和Extension的區別是什麼?
93.運算符的運算等級。
94.寫一個單例的實現代碼,要求可編譯。
95.寫一個字符串反轉的實現函數
96.寫一個委託的interface,寫一個代理。略
97.Overload和Override的區別?編譯器如何實現這兩種規則?
98.將「引用」函數做爲參數有哪些特色?何時須要「常引用」?
99.C和Obj-C如何混用?
100.cocoa有哪些設計模式?
101.socket編程中如何判斷異步connect是否成功?
102.iOS的七層模式?TCP/UDP屬於哪一層?TCP/UDP有何優缺點?
103.TCP/IP中端口有何做用?
104.- (NSInteger)v1:(NSInteger)x{
NSInteger c = 0;
while (x) {
x &= x - 1;
c ++;
}
return x;
}
當x = 9999時輸出是8.
PS:本身花時間收集的衆多面試題,但願對你們有幫助!