1.實現(xiàn)一個冒泡排序或者快速排序
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]);}
2.iOS平臺怎么做數(shù)據(jù)的持久化?coredata和sqlite有無必然聯(lián)系?coredata是一個關系型數(shù)據(jù)嗎?
core data是對sqlite的封裝亚铁,因為sqlite是c語言的api措译,然而有人也需要obj-c的api,所以有了core data ,另外来累,core data不僅僅是把c的api翻譯成oc的api没隘,還提供了一些管理的功能懂扼,使用更加方便。
?App升級之后數(shù)據(jù)庫字段或者表有更改會導致crash右蒲,CoreData的版本管理和數(shù)據(jù)遷移變得非常有用微王,手動寫sql語句操作還是麻煩一些。
?CoreData不光能操縱SQLite品嚣,CoreData和iCloud的結合也很好,如果有這方面需求的話優(yōu)先考慮CoreData钧大。
?CoreData并不是直接操縱數(shù)據(jù)庫翰撑,比如:使用CoreData時不能設置數(shù)據(jù)庫的主鍵,目前仍需要手動操作啊央。
3.Object-c的類可以多重繼承么?可以實現(xiàn)多個接口么?category是什么?重寫一個類的方式用繼承好還是分類好?為什么?
答: Object-c的類不可以多重繼承眶诈;可以實現(xiàn)多個接口,通過實現(xiàn)多個接口可以完成C++的多重繼承瓜饥;Category是類別逝撬,一般情況用分類好,用Category去重寫類的方法乓土,僅對本Category有效宪潮,不會影響到其他類與原有類的關系。
4.#import跟#include有什么區(qū)別,@class呢?#import<>跟#import””有什么區(qū)別?
答: #import是Objective-C導入頭文件的關鍵字趣苏,#include是C/C++導入頭文件的關鍵字,使用#import頭文件會自動只導入一次狡相,不會重復導入,相當于#include和#pragma once食磕;@class告訴編譯器某個類的聲明尽棕,當執(zhí)行時,才去查看類的實現(xiàn)文件彬伦,可以解決頭文件的相互包含滔悉;#import<>用來包含系統(tǒng)的頭文件,#import””用來包含用戶頭文件单绑。
5.屬性readwrite,readonly,assin,retain,copy,nonatomic各是什么作用,在哪種情況下用?
答: readwrite是可讀可寫特性回官;需要生成getter方法和setter方法時
readonly是只讀特性只會生成getter方法不會生成setter方法;不希望屬性在類外改變
assign是賦值特性,setter方法將傳入?yún)?shù)賦值給實例變量询张;僅設置變量時孙乖;
retain表示持有特性,setter方法將傳入?yún)?shù)先保留,再賦值唯袄,傳入?yún)?shù)的retaincount會+1;
copy表示拷貝特性弯屈,setter方法將傳入對象復制一份;需要完全一份新的變量時恋拷。
nonatomic非原子操作资厉,決定編譯器生成的setter
getter是否是原子操作,atomic表示多線程安全蔬顾,一般使用nonatomic
6.什么情況下使用關鍵字weak和assign有何不同?
答:assign指針賦值,不對引用計數(shù)操作,使用之后如果沒有置為nil,可能就會產(chǎn)生野指針;而weak一旦不進行使用后,永遠不會使用了,就不會產(chǎn)生野指針!
7.簡述CALayer和UIView的關系
答:UIView和CALayer是相互依賴的關系宴偿。UIView依賴與calayer提供的內(nèi)容,CALayer依賴uivew提供的容器來顯示繪制的內(nèi)容诀豁。歸根到底CALayer是這一切的基礎窄刘,如果沒有CALayer,UIView自身也不會存在舷胜,UIView是一個特殊的CALayer實現(xiàn)彩库,添加了響應事件的能力卵酪。UIView來自CALayer辱魁,高于CALayer喧枷,是CALayer高層實現(xiàn)與封裝。UIView的所有特性來源于CALayer支持沮焕。
8.KVO的實現(xiàn)原理?
答:KVO:當指定的對象的屬性被修改了吨岭,允許對象接收到通知的機制。
9.如何給一個對象的私有屬性賦值?
答:利用KVC即鍵值編碼來給對象的私有屬性賦值.
10.block的本質(zhì)是什么?為啥在block里面更改外面變量的值,要給外面的變量加_block修飾,加_block修飾的原理是什么?
答: (1) block本質(zhì)是一個數(shù)據(jù)類型,多用于參數(shù)傳遞,代替代理方法, (有多個參數(shù)需要傳遞或者多個代理方法需要實現(xiàn)還是推薦使用代理方法),少用于當做返回值傳遞. block是一個OC對象,它的功能是保存代碼片段,預先準備好代碼,并在需要的時候執(zhí)行.
(2)因為使用block代碼塊可能會引起內(nèi)部循壞引用,所以應在block定義前加上修飾
11.block在哪種情況下會造成循環(huán)引用,如何解決?
答:(1)從兩方面分析造成循環(huán)引用問題
當self擁有一個block的時候峦树,在block又調(diào)用self的方法(或者self所擁有的某個屬性)辣辫。形成你中有我,我中有你魁巩,這種時候會造成循環(huán)引用
把某個實例變量變成本地臨時變量,強引用將直接指向這個本地臨時變量,但本地臨時變量一般都會很快釋放,所以一般考慮第一種情況
(2)解決方案:對block進行修飾__weak(arc)或__block(mrc)
12.NSRunLoop的實現(xiàn)機制,及在多線程中如何使用?
答案:NSRunLoop是iOS的消息機制的處理模式
>1NSRunloop的主要作用:控制runloop里面線程的執(zhí)行和休眠,在有事情做的時候使擋墻NSRunloop控制的線程工作,沒有事情做讓當前runloop的控制線程休眠.
>2.runloop就是一直在循環(huán)檢測,從線程start到線程end,檢測inputsourse(如點擊,雙擊等操作)異步時間,檢測timesourse同步事件,見到檢測到輸入源會執(zhí)行處理函數(shù)络它,首先會產(chǎn)生通知,corefunction向線程添加runloop?observers來監(jiān)聽事件歪赢,意在監(jiān)聽事件發(fā)生時來做處理化戳。
>3.runloopmode是一個集合,包括監(jiān)聽:事件源埋凯,定時器点楼,以及需通知的runloop?observers
13.簡述視圖控制器的生命周期。
1)白对、init函數(shù)(init;initWithFrame;initWithCoder;等)--初始化
2)掠廓、awakeFromNib--在loadView之前的工作放在這里
3)、viewDidLoad甩恼,一個ViewController一個生命周期內(nèi)這個函數(shù)只會調(diào)用一次
4)蟀瞧、viewWillAppear--view將要出現(xiàn)沉颂,每次View消失再出現(xiàn)都會調(diào)用
5)、viewWillLayoutSubviews--簡要對子試圖進行布局
6)悦污、viewDidLayoutSubivews--完成對子試圖布局
7)铸屉、viewDidAppear--視圖將要出現(xiàn)在屏幕上
8)、viewWillDisappear--View將要消失
9)viewDidDisappear--View已經(jīng)消失
14.如何增強iOS應用程序的性能切端。
1)彻坛、使用ARC進行內(nèi)存管理、2).在適當?shù)那闆r下使用reuseIdentifier
3).盡可能將View設置為不透明(Opaque)4.避免臃腫的XIBs 5.不要阻塞主線程6.讓圖片的大小跟UIImageView一樣7.選擇正確的集合8.使用GZIP壓縮
9.重用和延遲加載View 10.緩存踏枣、緩存昌屉、緩存11.考慮繪制12.處理內(nèi)存警告13.重用花銷很大的對象14.使用Sprite 15.避免重新處理數(shù)據(jù)16.選擇正確的數(shù)據(jù)格式17.設置適當?shù)谋尘皥D片18.降低Web內(nèi)容的影響19.設置陰影路徑20.優(yōu)化TableView 21.選擇正確的數(shù)據(jù)存儲方式
15.請介紹幾個常用的git命令。
git branch查看本地所有分支茵瀑、git status查看當前狀態(tài)间驮、git commit提交、git branch -a查看所有的分支马昨、git
branch -r查看本地所有分支