回看以往的面試題,總結(jié)整理了一番
*面試心聲:總結(jié)起來就是把基礎(chǔ)的東西弄好,復(fù)雜的東西了解就ok了!
*此題庫是北上廣深杭各大小公司面試題。
*注:如今社會(huì)還是得靠本事,看面試題只是多了一個(gè)機(jī)會(huì),珍惜機(jī)會(huì)的同時(shí)提高自己硬實(shí)力才是真理!
友情提示:題庫過長,全200道只能上傳100道,需要完整PDF文檔,可進(jìn)入小編iOS交流群:624212887,群文件直接獲取,更多技術(shù)書籍,面試資料盡在此,歡迎入駐,交流探討
題庫:
1.給定一個(gè)字符串,輸出本字符串中只出現(xiàn)一次并且最靠前的那個(gè)字符的位置?比如“abaccddeeef”則是b,輸出2
答:
int main()
{
char a[80] = "abaccddeeef\0";
char ch;
int i, m, b[80];
int flag = 0;
ch = getchar();//獲取一個(gè)字符
m = strlen(a);
for (i = 0; i < m; ++i){
if (a[i] == ch){//找到了,直接判斷是否相等
b[flag] = i+1;//記錄位置
flag += 1;
}
}
if (flag == 0)printf ("no");
else {
printf ("%d\n", flag);
for (i = 0; i < flag; i++){//對位置進(jìn)行輸出,用循環(huán)
printf ("%d ", b[i]);
}
printf ("\n");
}
return 0;
}
2.實(shí)現(xiàn)一個(gè)冒泡排序或者快速排序
答:冒泡排序:
intarray[5] = { 28,27,36,45,8};
for (int i = 0; i < 4; i++) {
for(int j = 0; j < 4; j++) {
if (array[j] > array [j + 1]){
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}}}
for(int i = 0; i < 5; i++) {
printf("%d\n",array[i]);}
3.請編寫一個(gè)函數(shù)用于計(jì)算階乘
答:
int f(int i)
{intt=1,j;
for(j=1;j<=i;j++)
t=t*j;
return t;
}
4.Cocoa Touch提供了幾種Core
Animation過渡類?
答:Cocoa Touch提供了4種Core
Animation過渡類型,分別為:交叉淡化、推擠、顯示和覆蓋。
5.iOS平臺(tái)怎么做數(shù)據(jù)的持久化?coredata和sqlite有無必然聯(lián)系?coredata是一個(gè)關(guān)系型數(shù)據(jù)嗎?
答:數(shù)據(jù)的持久化本質(zhì)上都是就是寫文件,但從邏輯上又分成很多種,比如寫入沙盒,比如存到網(wǎng)絡(luò)上,比如寫入數(shù)據(jù)庫。
core data是對sqlite的封裝,因?yàn)閟qlite是c語言的api,然而有人也需要obj-c的api,所以有了core data ,另外,core data不僅僅是把c的api翻譯成oc的api,還提供了一些管理的功能,使用更加方便。
?App升級(jí)之后數(shù)據(jù)庫字段或者表有更改會(huì)導(dǎo)致crash,CoreData的版本管理和數(shù)據(jù)遷移變得非常有用,手動(dòng)寫sql語句操作還是麻煩一些。
?CoreData不光能操縱SQLite,CoreData和iCloud的結(jié)合也很好,如果有這方面需求的話優(yōu)先考慮CoreData。
?CoreData并不是直接操縱數(shù)據(jù)庫,比如:使用CoreData時(shí)不能設(shè)置數(shù)據(jù)庫的主鍵,目前仍需要手動(dòng)操作。
6.Object-c的類可以多重繼承么?可以實(shí)現(xiàn)多個(gè)接口么?category是什么?重寫一個(gè)類的方式用繼承好還是分類好?為什么?
答: Object-c的類不可以多重繼承;可以實(shí)現(xiàn)多個(gè)接口,通過實(shí)現(xiàn)多個(gè)接口可以完成C++的多重繼承;Category是類別,一般情況用分類好,用Category去重寫類的方法,僅對本Category有效,不會(huì)影響到其他類與原有類的關(guān)系。
7.#import跟#include有什么區(qū)別,@class呢?#import<>跟#import””有什么區(qū)別?
答: #import是Objective-C導(dǎo)入頭文件的關(guān)鍵字,#include是C/C++導(dǎo)入頭文件的關(guān)鍵字,使用#import頭文件會(huì)自動(dòng)只導(dǎo)入一次,不會(huì)重復(fù)導(dǎo)入,相當(dāng)于#include和#pragma once;@class告訴編譯器某個(gè)類的聲明,當(dāng)執(zhí)行時(shí),才去查看類的實(shí)現(xiàn)文件,可以解決頭文件的相互包含;#import<>用來包含系統(tǒng)的頭文件,#import””用來包含用戶頭文件。
8.屬性readwrite,readonly,assin,retain,copy,nonatomic各是什么作用,在哪種情況下用?
答: readwrite是可讀可寫特性;需要生成getter方法和setter方法時(shí)
readonly是只讀特性只會(huì)生成getter方法不會(huì)生成setter方法;不希望屬性在類外改變
assign是賦值特性,setter方法將傳入?yún)?shù)賦值給實(shí)例變量;僅設(shè)置變量時(shí);
retain表示持有特性,setter方法將傳入?yún)?shù)先保留,再賦值,傳入?yún)?shù)的retaincount會(huì)+1;
copy表示拷貝特性,setter方法將傳入對象復(fù)制一份;需要完全一份新的變量時(shí)。
nonatomic非原子操作,決定編譯器生成的setter
getter是否是原子操作,atomic表示多線程安全,一般使用nonatomic
9.寫一個(gè)setter方法用于完成@property(nonatomic,retain)NSString *name;寫一個(gè)setter方法用于完成@property(nonatomic, copy)NSString *name;
答:
-(void)setName:(NSString *) str
{
[str retain];
[name release];
name = str;
}
- (void)setName:(NSString *)str
{
id t = [str copy];
[name release];
name = t; }
10.對于語句NSString *obj =[[NSData alloc] init]; obj在編譯時(shí)和運(yùn)行時(shí)分別是什么類型的對象?
答:編譯時(shí)是NSString的類型;運(yùn)行時(shí)是NSData類型的對象
11.當(dāng)前已經(jīng)編程實(shí)現(xiàn)函數(shù):int
rand100().該函數(shù)可返回0~99的隨機(jī)整數(shù),且可以保證等概率.請利用該函數(shù)實(shí)現(xiàn)int rand10000(),要求等概率返回0~9999的隨機(jī)數(shù).(不可使用其他的系統(tǒng)函數(shù))
12.湯姆現(xiàn)在要在家里舉行宴會(huì),他雖然有很多筷子,但這些筷子的長度并不完全相同,先已知每根筷子的長度,要求每位客人都能拿到兩根長度相同的筷子,求最多可邀請的客人數(shù).
編程實(shí)現(xiàn):int getMax(int arrLength[N])
13.現(xiàn)有一個(gè)整數(shù)序列,你可以交換其中的任意兩個(gè)數(shù)以得到一個(gè)新序列.求共能得到多少種可能結(jié)果.(注意:3,3,3,3無論怎么交換,只能得到一個(gè)序列)
編程實(shí)現(xiàn):int getTotal(int arrOrigin[N])
14.現(xiàn)有一個(gè)M行N列的數(shù)組,要求安裝反向斜對角線(右上->左下)的方式,打印該數(shù)組.編程實(shí)現(xiàn):intprintMatrix[int arrMatrix[M][N]]
下面樣例的打印順序?yàn)?
0->1->4->2->5->8->3->6->9->7->10->11
123
4567
8910 11
15.在UIKit中,frame與bounds的關(guān)系是( C )
A. frame是bounds的別名
B. frame是bounds的繼承類
C. frame的參考系是父規(guī)圖坐標(biāo), bounds的參考系是自身的坐標(biāo)
D.frame的參考系是自身坐標(biāo),bounds的參考系是父規(guī)圖的坐標(biāo)
16.一個(gè)類的delegate(代理)的作用不正確的是( D )
A.delegate中的函數(shù)在其他類中實(shí)現(xiàn)
B.主要用于不同類型的對象之間一對一傳遞消息
C.沒有指派則不會(huì)觸發(fā)
D.可以一個(gè)對象的delegate指派給多個(gè)其他類型的對象
17.下面關(guān)于Objective-C內(nèi)存管理的描述錯(cuò)誤的是(A )
A.當(dāng)使用ARC來管理內(nèi)存時(shí),對象的retain,dealloc方法不會(huì)被調(diào)用
B.autoreleasepool在drain的時(shí)候會(huì)釋放在其中分配的對象
C.當(dāng)使用ARC來管理內(nèi)存時(shí),在線程中大量分配對象而不用autoreleasepool則可能會(huì)造成內(nèi)存泄露
D.在使用ARC的項(xiàng)目中不能使用NSZone
18.下面block定義正確的是( A )
A.tyoedef void(^SuccessBlock)(BOOLsuccess);
B. tyoedef void(^SuccessBlock)(NSStringvalue,BOOL success);
C. tyoedef void^(SuccessBlock)(NSStringvalue,BOOL success);
D. tyoedef void^(SuccessBlock)(NSString*value);
19.UIButton從子類到父類一次繼承自:( D )
A. UIView-> UIViewController->UIController
B. UIResponder-> UIControl-> UIView
C. UIControl-> UIResponder->UIViewController
D. UIControl-> UIView-> UIResponder
20.下列關(guān)于iOS開發(fā)中類方法的使用描述,錯(cuò)誤的是:( C )
A.類方法可以調(diào)用類方法
B.類方法不可以調(diào)用實(shí)例方法,但是類方法可以通過創(chuàng)建對象來訪問實(shí)例方法
C.類方法不可以使用實(shí)例變量,包括self(可以使用self)
D.類方法作為消息,可以被發(fā)送到類或者對象里面去
21.什么情況下使用關(guān)鍵字weak和assign有何不同?
答:assign指針賦值,不對引用計(jì)數(shù)操作,使用之后如果沒有置為nil,可能就會(huì)產(chǎn)生野指針;而weak一旦不進(jìn)行使用后,永遠(yuǎn)不會(huì)使用了,就不會(huì)產(chǎn)生野指針!
22.Object-C的類可以多重繼承么?可以實(shí)現(xiàn)多個(gè)接口么?Category是什么?重寫一個(gè)類方法的方法用繼承好還是分類好?為什么?*8
答: Object-c的類不可以多重繼承;可以實(shí)現(xiàn)多個(gè)接口,通過實(shí)現(xiàn)多個(gè)接口可以完成C++的多重繼承;Category是類別,一般情況用分類好,用Category去重寫類的方法,僅對本Category有效,不會(huì)影響到其他類與原有類的關(guān)系。
23.如何用iOS設(shè)備進(jìn)行性能測試?
答: Profile-> Instruments ->Time Profiler
24.我們說的oc是動(dòng)態(tài)運(yùn)行時(shí)語音是什么意思?
答案:多態(tài)。主要是將數(shù)據(jù)類型的確定由編譯時(shí),推遲到了運(yùn)行時(shí)。這個(gè)問題其實(shí)淺涉及到兩個(gè)概念,運(yùn)行時(shí)和多態(tài)。簡單來說,運(yùn)行時(shí)機(jī)制使我們直到運(yùn)行時(shí)才去決定一個(gè)對象的類別,以及調(diào)用該類別對象指定方法。多態(tài):不同對象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)。意思就是假設(shè)生物類(life)都用有一個(gè)相同的方法-eat;那人類屬于生物,豬也屬于生物,都繼承了life后,實(shí)現(xiàn)各自的eat,但是調(diào)用是我們只需調(diào)用各自的eat方法。也就是不同的對象以自己的方式響應(yīng)了相同的消息(響應(yīng)了eat這個(gè)選擇器)。因此也可以說,運(yùn)行時(shí)機(jī)制是多態(tài)的基礎(chǔ)。
25.你的項(xiàng)目什么時(shí)候選擇使用GCD,什么時(shí)候選擇NSOperation?
答:項(xiàng)目中使用NSOperation的優(yōu)點(diǎn)是NSOperation是對線程的高度抽象,在項(xiàng)目中使用它,會(huì)使項(xiàng)目的程序結(jié)構(gòu)更好,子類化NSOperation的設(shè)計(jì)思路,是具有面向?qū)ο蟮膬?yōu)點(diǎn)(復(fù)用、封裝),使得實(shí)現(xiàn)是多線程支持,而接口簡單,建議在復(fù)雜項(xiàng)目中使用。項(xiàng)目中使用GCD的優(yōu)點(diǎn)是GCD本身非常簡單、易用,對于不復(fù)雜的多線程操作,會(huì)節(jié)省代碼量,而Block參數(shù)的使用,會(huì)是代碼更為易讀,建議在簡單項(xiàng)目中使用。
26.讀文件是輸入流還是輸出流?
東西讀入內(nèi)存就是輸入流東西從內(nèi)存寫到記錄存儲(chǔ)輸出流而我們本身就以記錄存儲(chǔ)為原點(diǎn)所有會(huì)有不解的感覺~java io流按照java io流的方向可以分為輸入流和輸出流輸入流是將資源數(shù)據(jù)讀入到緩沖Buffer中,輸出流是將緩沖Buffer中的數(shù)據(jù)按照指定格式寫出到一個(gè)指定的位置,所以這兩個(gè)流一般同時(shí)使用,才有意義。例如你要做文件的上傳,你要先用輸入流將待上傳文件讀入緩沖,然后用輸出流將文件寫出到網(wǎng)絡(luò)服務(wù)器的一個(gè)位置,則上傳成功;若是文件下載,則先獲得輸入流,來讀取網(wǎng)絡(luò)服務(wù)器中的一個(gè)文件,然后用輸出流寫到本地的一個(gè)文件中;還有例如文件的拷貝,也是先用輸入流讀再用輸出流寫出去的很好的例子,你可以先做一個(gè)小例子試試,對你理解java io有幫助
27.簡述CALayer和UIView的關(guān)系
答:UIView和CALayer是相互依賴的關(guān)系。UIView依賴與calayer提供的內(nèi)容,CALayer依賴uivew提供的容器來顯示繪制的內(nèi)容。歸根到底CALayer是這一切的基礎(chǔ),如果沒有CALayer,UIView自身也不會(huì)存在,UIView是一個(gè)特殊的CALayer實(shí)現(xiàn),添加了響應(yīng)事件的能力。
結(jié)論:
UIView來自CALayer,高于CALayer,是CALayer高層實(shí)現(xiàn)與封裝。UIView的所有特性來源于CALayer支持。
28.聲明一個(gè)靜態(tài)方法和一個(gè)實(shí)例方法
答:先說實(shí)例方法,當(dāng)你給一個(gè)類寫一個(gè)方法,如果該方法需要訪問某個(gè)實(shí)例的成員變量時(shí),那么就將該方法定義成實(shí)例方法。一類的實(shí)例通常有一些成員變量,其中含有該實(shí)例的狀態(tài)信息。而該方法需要改變這些狀態(tài)。那么該方法需要聲明成實(shí)例方法。
靜態(tài)方法正好相反,它不需要訪問某個(gè)實(shí)例的成員變量,它不需要去改變某個(gè)實(shí)例的狀態(tài)。我們把該方法定義成靜態(tài)方法。
29.常見的Object-C的數(shù)據(jù)類型有哪些?和Cd基本數(shù)據(jù)類型有什么區(qū)別?
答: object-c的數(shù)據(jù)類型有nsstring,nsnumber,nsarray,nsmutablearray,nsdata等等,這些都是class,創(chuàng)建后便是對象,而c語言的基本數(shù)據(jù)類型int,只是一定字節(jié)的內(nèi)存空間,用于存放數(shù)值;而object-c的nsnumber包含有父nsobject的方法和nsnumber自己的方法,可以完成復(fù)雜的操作。
30.UIView的動(dòng)畫效果有哪些
如UIViewAnimationOptionCurveEaseInOut
UIViewAnimationOptionCurveEaseIn
UIViewAnimationOptionCurveEaseOut
UIViewAnimationOptionTransitionFlipFromLeft
UIViewAnimationOptionTransitionFlipFromRight
UIViewAnimationOptionTransitionCurlUp
UIViewAnimationOptionTransitionCurlDown
31.你了解svn,cvs等版本控制工具么?
答:了解.
32.靜態(tài)鏈接庫(了解一下)
答:靜態(tài)庫是程序代碼的集合,是共享代碼的一種方式
靜態(tài)庫是閉源的存在形式.a和.framework
連接時(shí),靜態(tài)庫會(huì)被完全的復(fù)制到可執(zhí)行文件中,被多次使用就會(huì)有冗余拷貝,相當(dāng)于java里的jar包,把一些類編譯到一個(gè)包中,在不同的工程中如果導(dǎo)入此文件就可以使用里面的類,
33.什么是沙箱模型?哪些操作是屬于私有api范疇?
答:1、應(yīng)用程序可以在自己的沙盒里運(yùn)作,但是不能訪問任何其他應(yīng)用程序的沙盒。
2、應(yīng)用程序間不能共享數(shù)據(jù),沙盒里的文件不能被復(fù)制到其他應(yīng)用程序文件夾中,也不能把其他應(yīng)用程序文件夾中的文件復(fù)制到沙盒里。
3、蘋果禁止任何讀、寫沙盒以外的文件,禁止應(yīng)用程序?qū)?nèi)容寫到沙盒以外的文件夾中。
4、沙盒根目錄里有三個(gè)文件夾:Documents,一般應(yīng)該把應(yīng)用程序的數(shù)據(jù)文件存到這個(gè)文件夾里,用于存儲(chǔ)用戶數(shù)據(jù)或其他應(yīng)該定期備份的信息。Library,下有兩個(gè)文件夾,Caches存儲(chǔ)應(yīng)用程序再次啟動(dòng)所需的信息,Preferences包含應(yīng)用程序偏好設(shè)置文件,不過不要在這里修改偏好設(shè)置。temp,存放臨時(shí)文件,即應(yīng)用程序再次啟動(dòng)不需要的文件。
沙盒根目錄里有三個(gè)文件夾分別是:documents,tmp,Library。
1、Documents目錄:您應(yīng)該將所有de應(yīng)用程序數(shù)據(jù)文件寫入到這個(gè)目錄下。這個(gè)目錄用于存儲(chǔ)用戶數(shù)據(jù)或其它應(yīng)該定期備份的信息。
2、AppName.app目錄:這是應(yīng)用程序的程序包目錄,包含應(yīng)用程序的本身。由于應(yīng)用程序必須經(jīng)過簽名,所以您在運(yùn)行時(shí)不能對這個(gè)目錄中的內(nèi)容進(jìn)行修改,否則可能會(huì)使應(yīng)用程序無法啟動(dòng)。
3、Library目錄:這個(gè)目錄下有兩個(gè)子目錄:Caches和Preferences
Preferences目錄:包含應(yīng)用程序的偏好設(shè)置文件。您不應(yīng)該直接創(chuàng)建偏好設(shè)置文件,而是應(yīng)該使用NSUserDefaults類來取得和設(shè)置應(yīng)用程序的偏好.
Caches目錄:用于存放應(yīng)用程序?qū)S玫闹С治募?,保存?yīng)用程序再次啟動(dòng)過程中需要的信息。
4、tmp目錄:這個(gè)目錄用于存放臨時(shí)文件,保存應(yīng)用程序再次啟動(dòng)過程中不需要的信息。
iOS沙盒(sandbox)中的幾個(gè)目錄獲取方式:
//獲取沙盒主目錄路徑
NSString *homeDir = NSHomeDirectory();
//獲取Documents目錄路徑
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
//獲取Caches目錄路徑
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];
//獲取tmp目錄路徑
NSString *tmpDir = NSTemporaryDirectory();
//獲取當(dāng)前程序包中一個(gè)圖片資源(apple.png)路徑
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"];
UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
例子:
NSFileManager* fm=[NSFileManagerdefaultManager];
if(![fm fileExistsAtPath:[selfdataFilePath]]){
//下面是對該文件進(jìn)行制定路徑的保存
[fm createDirectoryAtPath:[selfdataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];
//取得一個(gè)目錄下得所有文件名
NSArray *files = [fm subpathsAtPath: [selfdataFilePath] ];
//讀取某個(gè)文件
NSData *data = [fm contentsAtPath:[selfdataFilePath]];
//或者
NSData *data = [NSDatadataWithContentOfPath:[self dataFilePath]];
}
34.協(xié)議是什么?有什么作用?
協(xié)議:聲明一系列的方法,可由任何類實(shí)施,即使遵守該協(xié)議的類沒有共同的超類。協(xié)議方法定義了獨(dú)立于任何特定類的行為。簡單的說,協(xié)議就是定義了一個(gè)接口,其他類負(fù)責(zé)來實(shí)現(xiàn)這些接口。如果你的類實(shí)現(xiàn)了一個(gè)協(xié)議的方法時(shí),則說該類遵循此協(xié)議。
協(xié)議的作用:
1.定義一套公用的接口(Public)
@required:必須實(shí)現(xiàn)的方法
@optional:可選實(shí)現(xiàn)的方法(可以全部都不實(shí)現(xiàn))
2.委托代理(Delegate)傳值:
它本身是一個(gè)設(shè)計(jì)模式,它的意思是委托別人去做某事。
比如:兩個(gè)類之間的傳值,類A調(diào)用類B的方法,類B在執(zhí)行過程中遇到問題通知類A,這時(shí)候我們需要用到代理(Delegate)。
又比如:控制器(Controller)與控制器(Controller)之間的傳值,從C1跳轉(zhuǎn)到C2,再從C2返回到C1時(shí)需要通知C1更新UI或者是做其它的事情,這時(shí)候我們就用到了代理(Delegate)傳值。
35.你在開發(fā)大型項(xiàng)目時(shí),如何進(jìn)行內(nèi)存泄露檢測的?
可以通過xcode的自帶工具run---start with performance tool里有instruments下有個(gè)leaks工具,
啟動(dòng)此工具后,運(yùn)行項(xiàng)目,工具里可以顯示內(nèi)存泄露的情況,雙擊可找到源碼位置,可以幫助進(jìn)行內(nèi)存泄露的處理。
36.你實(shí)現(xiàn)過一個(gè)框架或者庫以供別人使用么?如果有,請談一談構(gòu)建框架或者庫是的經(jīng)驗(yàn);如果沒有,請?jiān)O(shè)想和設(shè)計(jì)框架的public的API,并指出大概需要如何做,需要注意一些什么方面,來方便別人容易地使用你的框架.
37.app從創(chuàng)建應(yīng)用到上架過程(appstore)
在你開始將程序提交到App Store之前,你需要有一個(gè)App ID,一個(gè)有效的發(fā)布證書,以及一個(gè)有效的Provisioning profile。
在itunesconnect網(wǎng)站上,創(chuàng)建app應(yīng)用,設(shè)置對應(yīng)信息,上傳app打包文件,提交等待審核
38.用你熟悉的語音,編程實(shí)現(xiàn)Fibonacci數(shù)列:int F(intn);
Fibonacci數(shù)列遞推式F(n) = F(n-1) +F(n-2)
F(1) = 1
F(2) = 2
F(3) = 3
F(4) = 5
F(5) = 8
int F(int n){
if(n == 1){
return1;
}
return f(n-1)+f(n-2);
}
39.給定兩個(gè)排好序的數(shù)組A,B,請寫一個(gè)函數(shù),從中找出他們的公共元素:findCommon(A,B)并列舉其他可能的查找方法,越多越好
例如:
Array A = [1, 3, 5, 6, 9]
Array B = [2, 3, 6, 8, 10]
返回結(jié)果= [3, 6]
void FindCommon(int* a, int* b, int n)
{
int i = 0;
int j = 0 ;
while(i < n && j < n){
if (a[i] < b[j])
++i ;
else if(a[i] == b[j])
{
cout << a[i] << endl ;
++i ;
++j ;
}
else// a[i] > b[j]
++j ;
}
40.KVO的實(shí)現(xiàn)原理?
答:KVO:當(dāng)指定的對象的屬性被修改了,允許對象接收到通知的機(jī)制。
41.如何給一個(gè)對象的私有屬性賦值?
答:利用KVC即鍵值編碼來給對象的私有屬性賦值.
42.block的本質(zhì)是什么?為啥在block里面更改外面變量的值,要給外面的變量加_block修飾,加_block修飾的原理是什么?
答: (1) block本質(zhì)是一個(gè)數(shù)據(jù)類型,多用于參數(shù)傳遞,代替代理方法, (有多個(gè)參數(shù)需要傳遞或者多個(gè)代理方法需要實(shí)現(xiàn)還是推薦使用代理方法),少用于當(dāng)做返回值傳遞. block是一個(gè)OC對象,它的功能是保存代碼片段,預(yù)先準(zhǔn)備好代碼,并在需要的時(shí)候執(zhí)行.
(2)因?yàn)槭褂胋lock代碼塊可能會(huì)引起內(nèi)部循壞引用,所以應(yīng)在block定義前加上修飾
43.block在哪種情況下會(huì)造成循環(huán)引用,如何解決?
答:(1)從兩方面分析造成循環(huán)引用問題
當(dāng)self擁有一個(gè)block的時(shí)候,在block又調(diào)用self的方法(或者self所擁有的某個(gè)屬性)。形成你中有我,我中有你,這種時(shí)候會(huì)造成循環(huán)引用
把某個(gè)實(shí)例變量變成本地臨時(shí)變量,強(qiáng)引用將直接指向這個(gè)本地臨時(shí)變量,但本地臨時(shí)變量一般都會(huì)很快釋放,所以一般考慮第一種情況
(2)解決方案:對block進(jìn)行修飾__weak(arc)或__block(mrc)
44.NSURLSession在什么情況下回存在循環(huán)引用的問題,怎么解決?
答: (1)在使用NSURLSession簽訂其代理的時(shí)候會(huì)存在循環(huán)引用問題,因?yàn)槠浯硎莚etain強(qiáng)引用
(2)解決方案
(1)在下載完成后取消NSURLSession會(huì)話并釋放Session,賦值為nil。
(2)再視圖將要消失時(shí)也執(zhí)行同樣的操作。為了防止沒有下載完成就跳轉(zhuǎn)控制器。
具體如下:
/**視圖將要消失的時(shí)候,取消session*/
- (void)viewWillDisappear:(BOOL)animated
{
[superviewWillDisappear:animated];
//任務(wù)完成,取消NSURLSession
[self.sessioninvalidateAndCancel];
//釋放會(huì)話
self.session =nil;
}
45.如何自己實(shí)現(xiàn)GET緩存?
答:1.使用GET請求數(shù)據(jù)
2.iOS系統(tǒng)SDK已經(jīng)做好了緩存。需要的僅僅是設(shè)置下內(nèi)存緩存大小、磁盤緩存大小、以及緩存路徑,代碼如下
NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:urlCache];
46.在使用SQLite過程中,如果多條線程同時(shí)操作同一數(shù)據(jù)庫會(huì)造成什么問題,怎么解決?
答:(1)容易造成系統(tǒng)崩潰
(2)解決方案:開啟第3種串行模式,使用一個(gè)類(單例方式)操作數(shù)據(jù)庫。
47.如果提交一個(gè)Json格式的數(shù)據(jù)給后臺(tái)服務(wù)器,后臺(tái)服務(wù)器返回的是一段普通文字,用NSURLConnection/NSURLSession/AFN分別如何實(shí)現(xiàn)?
答:1.使用NSURLConnection發(fā)送請求的步驟很簡單
(1)創(chuàng)建一個(gè)NSURL對象,設(shè)置請求路徑(設(shè)置請求路徑)
(2)傳入NSURL創(chuàng)建一個(gè)NSURLRequest對象,設(shè)置請求頭和請求體(創(chuàng)建請求對象)
(3)使用NSURLConnection發(fā)送NSURLRequest(發(fā)送請求)
2.使用NSURLSession發(fā)送請求的步驟很簡單
1)確定請求路徑(一般由公司的后臺(tái)開發(fā)人員以接口文檔的方式提供),GET請求參數(shù)直接跟在URL后面
2)創(chuàng)建請求對象(默認(rèn)包含了請求頭和請求方法【GET】),此步驟可以省略
3)創(chuàng)建會(huì)話對象(NSURLSession)
4)根據(jù)會(huì)話對象創(chuàng)建請求任務(wù)(NSURLSessionDataTask)
5)執(zhí)行Task
6)當(dāng)?shù)玫椒?wù)器返回的響應(yīng)后,解析數(shù)據(jù)(XML|JSON|HTTP)
48.請描述一下SDWebImage內(nèi)部實(shí)現(xiàn)的原理
答:SDWebImage底層實(shí)現(xiàn)有沙盒緩存機(jī)制,主要由三塊組成
1、內(nèi)存圖片緩存
2、內(nèi)存操作緩存
3、磁盤沙盒緩存
49.你對runtime都有哪些了解,你在實(shí)現(xiàn)開發(fā)過程中,或是你在所使用的第三方框架中,有沒有使用過runtime的,如果有,請你描述一下其內(nèi)部實(shí)現(xiàn)機(jī)制
答:Runtime:runtime是一套比較底層的純C語言API,屬于1個(gè)C語言庫,包含了很多底層的C語言API。在我們平時(shí)編寫的OC代碼中,程序運(yùn)行過程時(shí),其實(shí)最終都是轉(zhuǎn)成了runtime的C語言代碼, runtime算是OC的幕后工作者.
50.線程間怎么通信?
(1)GCD:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
//下載圖片
UIImage *image = nil;
dispatch_async(dispatch_get_main_queue(),^{
//回到主線程
});
(2)NSThread的線程通信
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
//下載圖片
UIImage *image = nil;
[selfperformSelector:@selector(settingImage:) onThread:[NSThread mainThread]withObject:image waitUntilDone:YES modes:nil];
}
這種情況也適用于子線程之間的通信。
51.網(wǎng)絡(luò)圖片處理問題中怎么解決一個(gè)相同的網(wǎng)絡(luò)地址重復(fù)請求的問題?
答案:利用字典圖片地址為key,下載操作為value
52.自動(dòng)釋放池底層怎么實(shí)現(xiàn)?
答:自動(dòng)釋放池以棧的形式實(shí)現(xiàn):當(dāng)你創(chuàng)建一個(gè)新的自動(dòng)釋放池時(shí),它將被添加到棧頂.當(dāng)一個(gè)對象收到發(fā)送autorelease消息時(shí),他被添加到當(dāng)前線程的處于棧頂?shù)淖詣?dòng)釋放池中,當(dāng)自動(dòng)釋放池被回收時(shí),他們從棧中被刪除,并且會(huì)給池子里面所有的對象都會(huì)做一次release操作
53.不用中間變量,用兩種方法交換A和B的值
A = A+B;
B = A - B;
A = A - B;
54.簡單描述一下客戶端的緩存機(jī)制?
答案:無法簡述,詳細(xì)了解下,明白了夠裝逼就好http://www.cnblogs.com/wendingding/p/3950198.html
55.控制器View的生命周期及相關(guān)函數(shù)是什么?你在開發(fā)中是如何用的?
1.在視圖顯示之前調(diào)用viewWillAppear;該函數(shù)可以調(diào)用多次;
2.視圖顯示完畢,調(diào)用viewDidAppear;
3.在視圖消失之前調(diào)用viewWillDisAppear;該函數(shù)可以調(diào)用多次(如需要);
4.在布局變化前后,調(diào)用viewWill/DidLayoutSubviews處理相關(guān)信息;
56.NSRunLoop的實(shí)現(xiàn)機(jī)制,及在多線程中如何使用?
答案:NSRunLoop是iOS的消息機(jī)制的處理模式
1NSRunloop的主要作用:控制runloop里面線程的執(zhí)行和休眠,在有事情做的時(shí)候使擋墻NSRunloop控制的線程工作,沒有事情做讓當(dāng)前runloop的控制線程休眠.
2.runloop就是一直在循環(huán)檢測,從線程start到線程end,檢測inputsourse(如點(diǎn)擊,雙擊等操作)異步時(shí)間,檢測timesourse同步事件,見到檢測到輸入源會(huì)執(zhí)行處理函數(shù),首先會(huì)產(chǎn)生通知,corefunction向線程添加runloop observers來監(jiān)聽事件,意在監(jiān)聽事件發(fā)生時(shí)來做處理。
3.runloopmode是一個(gè)集合,包括監(jiān)聽:事件源,定時(shí)器,以及需通知的runloop observers
1.只有在為你的程序創(chuàng)建次線程的時(shí)候,才需要運(yùn)行run loop。對于程序的主線程而言,run loop是關(guān)鍵部分。Cocoa提供了運(yùn)行主線程run loop的代碼同時(shí)也會(huì)自動(dòng)運(yùn)行run loop。IOS程序UIApplication中的run方法在程序正常啟動(dòng)的時(shí)候就會(huì)啟動(dòng)run loop。如果你使用xcode提供的模板創(chuàng)建的程序,那你永遠(yuǎn)不需要自己去啟動(dòng)run loop
2.在多線程中,你需要判斷是否需要run loop。如果需要run loop,那么你要負(fù)責(zé)配置run loop并啟動(dòng)。你不需要在任何情況下都去啟動(dòng)run loop。比如,你使用線程去處理一個(gè)預(yù)先定義好的耗時(shí)極長的任務(wù)時(shí),你就可以毋需啟動(dòng)run loop。Run loop只在你要和線程有交互時(shí)才需要
57.簡單說一下APP的啟動(dòng)過程,從main文件開始說起
進(jìn)入main函數(shù),在main.m的main函數(shù)中執(zhí)行了UIApplicationMain這個(gè)方法,這是ios程序的入口點(diǎn)!
int UIApplicationMain(int argc, char argv[], NSString principalClassName, NSString *delegateClassName)
argc、argv:ISO C標(biāo)準(zhǔn)main函數(shù)的參數(shù),直接傳遞給UIApplicationMain進(jìn)行相關(guān)處理即可
principalClassName:指定應(yīng)用程序類,該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為默認(rèn)值
delegateClassName:指定應(yīng)用程序類的代理類,該類必須遵守UIApplicationDelegate協(xié)議
此函數(shù)會(huì)根據(jù)principalClassName創(chuàng)建UIApplication對象,根據(jù)delegateClassName創(chuàng)建一個(gè)delegate對象,并將該delegate對象賦值給UIApplication對象中的delegate屬性
lUIApplication對象會(huì)依次給delegate對象發(fā)送不同的消息,接著會(huì)建立應(yīng)用程序的main runloop(事件循環(huán)),進(jìn)行事件的處理(首先會(huì)調(diào)用delegate對象的application:didFinishLaunchingWithOptions:)
程序正常退出時(shí)這個(gè)函數(shù)才返回。如果進(jìn)程要被系統(tǒng)強(qiáng)制殺死,一般這個(gè)函數(shù)還沒來得及返回進(jìn)程就終止了
58.第三方API你是怎么用的?
cocoa pod導(dǎo)入
59.用預(yù)處理指令#define聲明一個(gè)常數(shù),用以表明一年中有多少秒?(忽略閏年問題)
答:#define second 3652460*60
60.UITableView需要實(shí)現(xiàn)哪些代理?列出UITableView代理中必須實(shí)現(xiàn)的與其他一些常用的函數(shù).
答:
-( NSInteger )tableView:( UITableView *)tableViewnumberOfRowsInSection:( NSInteger)section;
一組有多少行
-( UITableViewCell *)tableView:( UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath;
每行中的cell的實(shí)現(xiàn)以上兩個(gè)方法為必須要實(shí)現(xiàn)的
常用的有
- ( void )tableView:( UITableView )tableViewdidSelectRowAtIndexPath:( NSIndexPath)indexPath
選中以后事件設(shè)置
-( CGFloat )tableView:( UITableView )tableViewheightForRowAtIndexPath:( NSIndexPath)indexPath
設(shè)置cell的高度
等等。。。。。
61.在iOS上開發(fā)一個(gè)應(yīng)用程序時(shí)怎么做的?
答:首先,要有一個(gè)MAC系統(tǒng)(買一臺(tái)蘋果電腦,蘋果本或者M(jìn)ACmini),沒有這個(gè)條件可以裝一個(gè)黑蘋果的mac系統(tǒng)或者裝一個(gè)虛擬機(jī)。然后裝一個(gè)X-CODE開發(fā)環(huán)境。要是學(xué)習(xí)ios開發(fā)的話,這些就可以了。如果要開發(fā)、上線的話,就得準(zhǔn)備iphone/ipod、ipad做為測試機(jī),到蘋果申請一個(gè)開發(fā)者賬號(hào),每年的年費(fèi)99美元。再然后接著就可以開發(fā)你的程序了,開發(fā)完畢之后,發(fā)布到App store上面,通過審核就可以了。
62.C++和Objective-C的混合使用,以下描述錯(cuò)誤的是()
A. cpp文件只能使用C/C++代碼
B. cpp文件include的頭文件中,可以出現(xiàn)objective-C的代碼
C. mm文件中混用cpp直接使用即可
D. cpp使用objective-C的關(guān)鍵是使用接口,而不能直接使用代碼
63.以下哪一段代碼不會(huì)拋出異常( C& D )
A. NSArray array = @[1, 2, 3];NSNumbernumber = array[3];// @[@1,@ 2,@ 3]
B. NSDictionary *dict = @{@”key”:
nil};//value不能為空
C. NSString *str = nil; NSString *str2 =[str substringFromIndex:3];
D. NSString *str = @”hi”;NSString *str2 =[str substringFromIndex:3];
64.在沒有navigationController的情況下,要從一個(gè)ViewController切換到另一個(gè)ViewController應(yīng)該()
A.{self.navigationControllerpushViewController:nextViewController animated:YES};
B.{self .viewaddSubview:nextViewController}
C. {selfpresentModalViewController:nextViewController animated:YES};
D. {selfpushViewController:nextViewController animated:YES};
分析:A、C都需要有navigationController,B一個(gè)控制器的view是無法加載另一個(gè)控制器的view的,所以選C!
65.關(guān)于下面線程管理錯(cuò)誤的是()
//不確定
A.GCD在后端管理著一個(gè)線程池
B.NSOperationQueue是對NSthread的更高層的封裝,對
C.NSThread需要自己管理線程的生命周期
D.GCD可以根據(jù)不同優(yōu)先級(jí)分配線程,對
66.iOS中的數(shù)據(jù)持久化方式(D)
A.屬性列表
B.對象歸檔
C.SQLite和CoreData
D.以上全部+對象歸檔
67.設(shè)有一下宏定義:
defineN4
defineY(n)((N + 1) * n)
則執(zhí)行語句: Y(5 + 1)為:(26)
68.如下程序用于把"blue"字符串返回,請指出其中的錯(cuò)誤.
//不確定
char *GetBlue()
{
char *pcColor;
char*pcNewColor;
pcColor = “blue”;
pcNewColor =(char*)malloc(strlen(pcColor));
strcpy(pcNewColor, pcColor);
return pcNewColor;
}
答:strcpy是一個(gè)字符串拷貝的函數(shù),它的函數(shù)原型為strcpy(char *dst, c*****t char *src);將src開始的一段字符串拷貝到dst開始的內(nèi)存中去,結(jié)束的標(biāo)志符號(hào)為'\0',由于拷貝的長度不是由我們控制的,所以這個(gè)字符串拷貝很容易出錯(cuò)
69.常見的object-c的數(shù)據(jù)類型有哪些,和C的基本數(shù)據(jù)類型有什么區(qū)別?如:NSInteger和int
答:object的數(shù)據(jù)類型由NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,創(chuàng)建后便是對象,而C語言的基本數(shù)據(jù)類型int,只是一定字節(jié)的內(nèi)存空間,用于存放數(shù)值,NSInteger是基本的數(shù)據(jù)類型,并不是NSNumber的子類,當(dāng)然也不是NSObject的子類。NSInteger是基本數(shù)據(jù)類型int或者Long的別名(NSInteger的定義typedef long NSInteger)它的區(qū)別在于,NSInteger會(huì)根據(jù)系統(tǒng)是32位還是64位來決定是本身int還是long.
70.iOS有垃圾回收機(jī)制嗎?它是以怎樣的機(jī)制來工作的?
答: OC是支持垃圾回收機(jī)制的(Garbage collection簡稱GC),但是apple的移動(dòng)終端中,是不支持GC的,Mac桌面系統(tǒng)開發(fā)中是支持的.
移動(dòng)終端開發(fā)是支持ARC(Automatic
Reference Counting的簡稱),ARC是在IOS5之后推出的新技術(shù),它與GC的機(jī)制是不同的。我們在編寫代碼時(shí),不需要向?qū)ο蟀l(fā)送release或者autorelease方法,也不可以調(diào)用delloc方法,編譯器會(huì)在合適的位置自動(dòng)給用戶生成release消息(autorelease),ARC的特點(diǎn)是自動(dòng)引用技術(shù)簡化了內(nèi)存管理的難度.
71.請使用gcd完成如下任務(wù),執(zhí)行并發(fā)任務(wù)task1,task1完成后update UI.
答:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
//task1:
NSLog(@"執(zhí)行task1");
//更新UI
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"更新UI");
});
});
72.為什么在主線程中更新UI?子線程中想要更新UI怎么做?
答:(1)在子線程中不能更新UI,除了極少數(shù)UI外,其他UI更新要等到子線程執(zhí)行完畢后回到主線程中進(jìn)行更新。如果子線程一直在運(yùn)行,則子線程中UI更新的函數(shù)棧主線程無法得知,即UI無法更新;
(2)回到主線程中進(jìn)行UI更新;
73.簡述通過Storyboard實(shí)現(xiàn)一個(gè)tableView
(自定義cell的關(guān)鍵步驟).
答:首先創(chuàng)建自己的自定義cell的類,我們叫做CustomCell,要繼承于UITableViewCell。在這個(gè)類中定義自己所需要的控件。
然后,打開storyboard,選擇自己要添加自定義cell的UIViewController,我們叫它為ViewController。在UITableView里面添加一個(gè)cell(或者修改原有的cell)。將cell的style改為custom,將cell的類改為CustomCell,將identifier改為CustomCellIdentifier。然后,可以在cell中添加控件,將控件和剛才在CustomCell中定義的控件連起來。
最后,在ViewController的UITableView的tableView:cellForRowAtIndexPath:代理方法中添加以下代碼:
[plain]
CustomCell*cell=[tableViewdequeueReusableCellWithIdentifier:@"CustomCellIdentifier"];
這樣,就創(chuàng)建了一個(gè)cell,可以在這句代碼之后對自己添加的控件進(jìn)行設(shè)置。
74.如何生成同時(shí)支持多個(gè)架構(gòu)(simulator,arm7,arm64)的通用靜態(tài)庫?
答:ValidArchitectures設(shè)置為:armv7|armv7s|arm64|i386|x86_64;
Architectures設(shè)置不變(或根據(jù)你需要):armv7|arm64;
然后分別選擇iOS設(shè)備和模擬器進(jìn)行編譯,最后找到相關(guān)的.a進(jìn)行合包,使用lipo -create真機(jī)庫.a的路徑模擬器庫.a的的路徑-output合成庫的名字.a;
這樣就制作了一個(gè)通用的靜態(tài)庫.a;
75.請寫出一個(gè)xml文件,用于描述一個(gè)書架,書架上有2本書,書本的類別(category)分別是cooking,children.要求tag中包含書名(title),作者(author).類別(category)要用屬性表示.
答:
書名1<\title>
作者1<\author>
<\book>
書名2<\title>
作者2<\author>
<\book>
76.strcpy和memcpy的最大區(qū)別是什么?
答:1、復(fù)制的內(nèi)容不同。strcpy只能復(fù)制字符串,而memcpy可以復(fù)制任意內(nèi)容,例如字符數(shù)組、整型、結(jié)構(gòu)體、類等。
2、復(fù)制的方法不同。strcpy不需要指定長度,它遇到被復(fù)制字符的串結(jié)束符"\0"才結(jié)束,所以容易溢出。memcpy則是根據(jù)其第
3個(gè)參數(shù)決定復(fù)制的長度。
3、用途不同。通常在復(fù)制字符串時(shí)用strcpy,而需要復(fù)制其他類型數(shù)據(jù)時(shí)則一般用memcpy
108.g++, ld是什么?聲明編譯選項(xiàng)–DSUPPORT_BLUETOOTH =
1有什么作用?
答: g++是GNU的c++編譯器;
77.@class用途
答:@class一般用于頭文件中聲明某個(gè)類的實(shí)例變量的時(shí)候用到.它只是聲明,至于內(nèi)部的實(shí)現(xiàn)是沒有告訴編譯器的.
78.delegate使用assign or retain簡述理由.
答:assign,防止出現(xiàn)循環(huán)引用;
79.NSString與NSData之間的轉(zhuǎn)換過程中要特別注意的事項(xiàng)是什么?
解:
NSString轉(zhuǎn)換成NSData對象
NSData* xmlData = [@"testdata"dataUsingEncoding:NSUTF8StringEncoding];
NSData轉(zhuǎn)換成NSString對象
NSData * data;
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSData轉(zhuǎn)換成char*
NSData *data;
char *test=[data bytes];
char*轉(zhuǎn)換成NSData對象
byte* tempData = malloc(sizeof(byte)*16);
NSData *content=[NSData dataWithBytes:tempData length:16];
轉(zhuǎn)換過程中要注意NSData的編碼格式問題.
解決方法:
先設(shè)置斷點(diǎn)然后在控制臺(tái)po出NSData的變量,看看會(huì)顯示什么。
如果po出的NSData是可閱讀的,直接能看到文本的內(nèi)容,則使用[NSString stringWithFormat:NSData] (這里的NSData指的是你需要轉(zhuǎn)換成NSString的NSData變量)即可。
如果po出的NSData是不可閱讀的亂碼,那一般都是有編碼格式的,最常用的是NSUTF8StringEncoding,另外還有NSASCIIStringEncoding等,你可以在Apple文檔里找到編碼格式的那個(gè)枚舉類型,挨個(gè)嘗試。
80.請用代碼如何判斷某個(gè)對象obj是否支持某個(gè)method.
解:
if ([srespondsToSelector:@selector(print:)]) {
[s print:@"支持這個(gè)方法"];
}
81.請用簡單的代碼展示@protocol的定義及實(shí)現(xiàn).
解:
#warning代理第一步:聲明協(xié)議
@protocol MarryMe
-(void)makeMoney;
@end
#warning代理第二步:聲明代理
@property(nonatomic,assign)id myDeleget;
.m文件中
#warning代理第三步:代理人執(zhí)行協(xié)議方法
[self.myDeleget makeMoney];
代理人.m文件中
#warning代理第四步:簽訂協(xié)議
@interface Boy : NSObject
Girl *girl = [[Girl alloc] init];
#warning代理第五步:成為代理人
girl.myDeleget = self;
[girl getMessage:message];
#warning協(xié)議代理第六步:實(shí)現(xiàn)協(xié)議方法
-(void)makeMoney{
NSLog(@"aaa");
}
82.請描述應(yīng)聘崗位的未來職業(yè)規(guī)劃
解:答案不唯一,如有需要請自行規(guī)劃活著百度.
83.3升的杯子一個(gè),5升的杯子一個(gè),杯子的形狀不規(guī)則,問怎么才能得到4升的水,水無限多.(請寫出推理過程)
解:先將5升的杯子倒?jié)M,然后把5升的杯子中的水倒入3升的杯子,倒?jié)M后5升的杯子剩下2升.再把3升杯子中的水倒掉,把5升的杯子中剩余的2升水倒入3升的杯子中,然后把5升的杯子倒?jié)M.再用5升的杯子中的水給3升的杯子添滿,則5升的杯子中剩余4升的水.
84.數(shù)據(jù)持久化存儲(chǔ)方案有哪些?
解:所謂的持久化,就是將數(shù)據(jù)保存到硬盤中,使得在應(yīng)用程序或機(jī)器重啟后可以繼續(xù)訪問之前保存的數(shù)據(jù)。在iOS開發(fā)中,數(shù)據(jù)持久化的方案有5種方案:
plist文件(屬性列表)
preference(偏好設(shè)置)
NSKeyedArchiver(歸檔)
SQLite 3
CoreData
85.網(wǎng)絡(luò)通信用過哪些方式?
解: ios設(shè)備的網(wǎng)絡(luò)通信的方法,有如下兩個(gè)大類:
1、使用socket的方式進(jìn)行通信。
2、使用asynsocket類庫進(jìn)行通信。
86.如何處理多個(gè)網(wǎng)絡(luò)請求并發(fā)的情況?
解: //了解(并發(fā))當(dāng)有多個(gè)線程在操作時(shí),如果系統(tǒng)只有一個(gè)CPU,則它根本不可能真正同時(shí)進(jìn)行一個(gè)以上的線程,它只能把CPU運(yùn)行時(shí)間劃分成若干個(gè)時(shí)間段,再將時(shí)間段分配給各個(gè)線程執(zhí)行,在一個(gè)時(shí)間段的線程代碼運(yùn)行時(shí),其它線程處于掛起狀。.這種方式我們稱之為并發(fā)(Concurrent)。
遇到這種情況建議使用第三方的網(wǎng)絡(luò)庫。比如AFNetworking。也可以通過GCD和NSOperationQueue來控制并發(fā)
87.簡單介紹一下KVC和KVO,他們都可以應(yīng)用在哪些場景?
解: KVO:鍵值監(jiān)聽,觀察某一屬性的方法
KVC:鍵值編碼,是一種間接訪問對象的屬性
88.講述一下runtime的概念,messagesend如果尋找不到響應(yīng)的對象,會(huì)如何?
Objc Runtime其實(shí)是一個(gè)Runtime庫,它基本上是用C和匯編寫的,這個(gè)庫使得C語言有了面向?qū)ο蟮哪芰Α?/p>
89. iOS能否嵌入其他語言?如何實(shí)現(xiàn)?
90. iOS移動(dòng)開發(fā)最終生成的是什么文件?其結(jié)構(gòu)如何?
最后打包完成是一個(gè).ipa文件可以通過iTunes和其他工具對有測試資格的手機(jī)進(jìn)行安裝
91. UINavigationController如何要使用push/pop功能的話,需要怎么實(shí)現(xiàn)
1.用UINavigationController的時(shí)候用pushViewController:animated
----返回之前的視圖[[selfnavigationController] popViewControllerAnimated:YES];
---ps:push以后會(huì)在navigation的left bar自動(dòng)添加back按鈕,它的響應(yīng)方法就是返回。所以一般不需要寫返回方法,點(diǎn)back按鈕即可。
2.其他時(shí)候用presentModalViewController:animated
[selfpresentModalViewController:controller animated:YES];//YES有動(dòng)畫效果
-----返回之前的視圖[selfdismissModalViewControllerAnimated:YES];
3.切換視圖一般用不到addSubview
UINavigationController是導(dǎo)航控制器,如果pushViewController的話,會(huì)跳轉(zhuǎn)到下一個(gè)ViewController,點(diǎn)返回會(huì)回到現(xiàn)在這個(gè)ViewController;
如果是addSubview的話,其實(shí)還是對當(dāng)前的ViewController操作,只是在當(dāng)前視圖上面又“蓋”住了一層視圖,其實(shí)原來的畫面在下面呢,看不到而已。
92. UIView如何需要重新繪制整個(gè)界面,需要調(diào)用什么方法?
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方便出來數(shù)據(jù)
setNeedDisplay告知視圖它發(fā)生了改變,需要重新繪制自身,就相當(dāng)于刷新界面.
93. Plist文件?結(jié)構(gòu)是?
Plist文件通常用于儲(chǔ)存用戶設(shè)置,也可以用于存儲(chǔ)捆綁的信息,該功能在舊式的Mac OS中是由資源分支提供的。
Plist主要有Core Fundation類型構(gòu)成,也可以將這些類型放入NSDictionary和NSArray以便后塍更復(fù)雜的數(shù)據(jù)類型
94. iOS里面的二進(jìn)制數(shù)據(jù)類型是什么?和NSString如何互相轉(zhuǎn)換?
NSData:用于存儲(chǔ)二進(jìn)制的數(shù)據(jù)類型
NSData類提供了一種簡單的方式,它用來設(shè)置緩沖區(qū)、將文件的內(nèi)容讀入緩沖區(qū),或?qū)⒕彌_區(qū)的內(nèi)容寫到一個(gè)文件。
不變緩沖區(qū)(NSData類),也可定義可變的緩沖區(qū)(NSMutableData類)。
NSData、NSString互轉(zhuǎn):
NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
//NSString轉(zhuǎn)換成NSData類型
NSString * newStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
95. iOS里面是否有GBK的字符編碼描述?即NSUTF8StringEncoding如果有,是怎樣的?
96. iOS里面的手勢是如何實(shí)現(xiàn)的?
97.談?wù)勀懔私獾脑O(shè)計(jì)模式,你用過哪些,他們的缺點(diǎn)
1.MVC:優(yōu)點(diǎn):
1、開發(fā)人員可以只關(guān)注整個(gè)結(jié)構(gòu)中的其中某一層;
2、可以很容易的用新的實(shí)現(xiàn)來替換原有層次的實(shí)現(xiàn);
3、可以降低層與層之間的依賴;
4、有利于標(biāo)準(zhǔn)化;
5、利于各層邏輯的復(fù)用。
缺點(diǎn):
1、降低了系統(tǒng)的性能。這是不言而喻的。如果不采用分層式結(jié)構(gòu),很多業(yè)務(wù)可以直接造訪數(shù)據(jù)庫,以此獲取相應(yīng)的數(shù)據(jù),如今卻必須通過中間層來完成。
2、有時(shí)會(huì)導(dǎo)致級(jí)聯(lián)的修改。這種修改尤其體現(xiàn)在自上而下的方向。如果在表示層中需要增加一個(gè)功能,為保證其設(shè)計(jì)符合分層式結(jié)構(gòu),可能需要在相應(yīng)的業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層中都增加相應(yīng)的代碼。
2.觀察者模式優(yōu)點(diǎn):
1、觀察者模式在被觀察者和觀察者之間建立一個(gè)抽象的耦合。被觀察者角色所知道的只是一個(gè)具體觀察者列表,每一個(gè)具體觀察者都符合一個(gè)抽象觀察者的接口。被觀察者并不認(rèn)識(shí)任何一個(gè)具體觀察者,它只知道它們都有一個(gè)共同的接口。
由于被觀察者和觀察者沒有緊密地耦合在一起,因此它們可以屬于不同的抽象化層次。如果被觀察者和觀察者都被扔到一起,那么這個(gè)對象必然跨越抽象化和具體化層次。
2、觀察者模式支持廣播通訊。被觀察者會(huì)向所有的登記過的觀察者發(fā)出通知,
觀察者模式缺點(diǎn):
1、如果一個(gè)被觀察者對象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會(huì)花費(fèi)很多時(shí)間。
2、如果在被觀察者之間有循環(huán)依賴的話,被觀察者會(huì)觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用,導(dǎo)致系統(tǒng)崩潰。在使用觀察者模式是要特別注意這一點(diǎn)。
3、如果對觀察者的通知是通過另外的線程進(jìn)行異步投遞的話,系統(tǒng)必須保證投遞是以自恰的方式進(jìn)行的。
4、雖然觀察者模式可以隨時(shí)使觀察者知道所觀察的對象發(fā)生了變化,但是觀察者模式?jīng)]有相應(yīng)的機(jī)制使觀察者知道所觀察的對象是怎么發(fā)生變化的。
3.單例模式:主要優(yōu)點(diǎn):
1、提供了對唯一實(shí)例的受控訪問。
2、由于在系統(tǒng)內(nèi)存中只存在一個(gè)對象,因此可以節(jié)約系統(tǒng)資源,對于一些需要頻繁創(chuàng)建和銷毀的對象單例模式無疑可以提高系統(tǒng)的性能。
3、允許可變數(shù)目的實(shí)例。
3.單例模式:主要缺點(diǎn):
1、由于單利模式中沒有抽象層,因此單例類的擴(kuò)展有很大的困難。
2、單例類的職責(zé)過重,在一定程度上違背了“單一職責(zé)原則”。
3、濫用單例將帶來一些負(fù)面問題,如為了節(jié)省資源將數(shù)據(jù)庫連接池對象設(shè)計(jì)為的單例類,可能會(huì)導(dǎo)致共享連接池對象的程序過多而出現(xiàn)連接池溢出;如果實(shí)例化的對象長時(shí)間不被利用,系統(tǒng)會(huì)認(rèn)為是垃圾而被回收,這將導(dǎo)致對象狀態(tài)的丟失.
98.數(shù)據(jù)持久化存儲(chǔ)方案有哪些?
答:
(附網(wǎng)址:http://www.cocoachina.com/industry/20130328/5908.html)
iOS中的數(shù)據(jù)持久化方式,基本上有以下四種:屬性列表、對象歸檔、SQLite3和Core Data
1.屬性列表(NSUserDefaults,用于存儲(chǔ)配置信息)
涉及到的主要類:NSUserDefaults,一般[NSUserDefaults standardUserDefaults]就夠用了
2.對象歸檔
要使用對象歸檔,對象必須實(shí)現(xiàn)NSCoding協(xié)議.大部分Object C對象都符合NSCoding協(xié)議,也可以在自定義對象中實(shí)現(xiàn)NSCoding協(xié)議,要實(shí)現(xiàn)NSCoding協(xié)議,實(shí)現(xiàn)兩個(gè)方法
3.SQLite3
SQLite的數(shù)據(jù)庫權(quán)限只依賴于文件系統(tǒng),沒有用戶帳戶的概念。SQLite有數(shù)據(jù)庫級(jí)鎖定,沒有網(wǎng)絡(luò)服務(wù)器。它需要的內(nèi)存,其它開銷很小,適合用于嵌入式設(shè)備。你需要做的僅僅是把它正確的編譯到你的程序。
4.Core Data
Core Data本質(zhì)上是使用SQLite保存數(shù)據(jù),但是它不需要編寫任何SQL語句。
要使用Core Data,需要在Xcode中的數(shù)據(jù)模型編輯器中設(shè)計(jì)好各個(gè)實(shí)體以及定義好他們的屬性和關(guān)系。之后,通過操作這些對象,結(jié)合Core Data完成數(shù)據(jù)的持久化:
99.網(wǎng)絡(luò)通信用過哪些方式?
(附網(wǎng)址:http://blog.csdn.net/chang6520/article/details/7967698)
同樣也是代碼解釋
iOS設(shè)備的網(wǎng)絡(luò)通信的方法,有如下兩個(gè)大類:
1、使用socket的方式進(jìn)行通信。
以TCP為利,對于TCP來說,是要區(qū)分服務(wù)端和客戶端的。服務(wù)端:通常的方法是服務(wù)端啟動(dòng)后監(jiān)聽,是否有客戶端連接,如果有連接,則建立與客戶端的通信??蛻舳说姆椒ㄍǔJ沁B接服務(wù)端,當(dāng)連接成功之后,就希望發(fā)送數(shù)據(jù)了。
2、使用asynsocket類庫進(jìn)行通信。
100.如何處理多個(gè)網(wǎng)絡(luò)請求并發(fā)的情況?
答:
(附網(wǎng)址:http://www.cnblogs.com/yanhuaxuanlan/p/4683557.html)
答案都是代碼,大家可以打開網(wǎng)址仔細(xì)閱讀
1.并發(fā)當(dāng)有多個(gè)線程在操作時(shí),如果系統(tǒng)只有一個(gè)CPU,則它根本不可能真正同時(shí)進(jìn)行一個(gè)以上的線程,它只能把CPU運(yùn)行時(shí)間劃分成若干個(gè)時(shí)間段,再將時(shí)間段分配給各個(gè)線程執(zhí)行,在一個(gè)時(shí)間段的線程代碼運(yùn)行時(shí),其它線程處于掛起狀。.這種方式我們稱之為并發(fā)(Concurrent)。
2.并行當(dāng)系統(tǒng)有一個(gè)以上CPU時(shí),則線程的操作有可能非并發(fā)。當(dāng)一個(gè)CPU執(zhí)行一個(gè)線程時(shí),另一個(gè)CPU可以執(zhí)行另一個(gè)線程,兩個(gè)線程互不搶占CPU資源,可以同時(shí)進(jìn)行,這種方式我們稱之為并行(Parallel)。
3.區(qū)別并發(fā)和并行是即相似又有區(qū)別的兩個(gè)概念,并行是指兩個(gè)或者多個(gè)事件在同一時(shí)刻發(fā)生;而并發(fā)是指兩個(gè)或多個(gè)事件在同一時(shí)間間隔內(nèi)發(fā)生。
101.簡單介紹一下KVC和KVO,他們都可以應(yīng)用在哪些場景?
答:
(附網(wǎng)址:http://blog.csdn.net/zhaozy55555/article/details/8598374
http://www.cnblogs.com/kenshincui/p/3871178.html)
KVC:NSKeyValueCoding的簡稱,是一種可以直接通過字符串的名字(key)來訪問類屬性的機(jī)制,而不是通過調(diào)用的Setter、Getter方法訪問。
KVC的操作方法由NSKeyValueCoding協(xié)議提供,NSObject就實(shí)現(xiàn)了這個(gè)協(xié)議,也就是說如果對象是NSObject的子對象那么就支持KVC操作,KVC有兩種操作方法,一種是設(shè)值,一種是取值,可以理解為getter和setter,不過稍微有所不同的是,設(shè)置對象值的方法中有兩個(gè),setValue:屬性值forKey:屬性名(一般的設(shè)置,比如說是說設(shè)置NSString,NSNumber等基本類類型,setetValue:屬性值forKeyPath:屬性路徑
2.KVO:NSKeyValueObserving的簡稱,當(dāng)指定的對象的屬性被修改了,允許對象接受到通知的機(jī)制。每次指定的被觀察對象的屬性被修改的時(shí)候,KVO都會(huì)自動(dòng)的去通知相應(yīng)的觀察者,相當(dāng)于設(shè)計(jì)模式中的觀察者模式。
Key-Value Observing (KVO)建立在KVC之上,能夠觀察一個(gè)對象的KVC key path值的變化,接下來的做的實(shí)例是在iOS中視圖的ViewDidLoad中實(shí)現(xiàn)的,跟KVC類似,不過可以監(jiān)聽值的變化,實(shí)現(xiàn)起來很簡單addObserver添加觀察,observeValueForKeyPath觀察變化之后的事件,最后需要銷毀以下監(jiān)聽事件,
需要完整PDF文檔,可進(jìn)入小編iOS交流群:624212887,群文件直接獲取,更多技術(shù)書籍,面試資料盡在此,歡迎入駐,交流探討