1. 父類實現(xiàn)深拷貝時,子類如何實現(xiàn)深度拷貝署惯。父類沒有實現(xiàn)深拷貝時左驾,子類如何實現(xiàn)深度拷貝。
1.1 深拷貝同淺拷貝的區(qū)別:
淺拷貝是指針拷貝极谊,對一個對象進(jìn)行淺拷貝诡右,相當(dāng)于對指向?qū)ο蟮闹羔樳M(jìn)行復(fù)制,產(chǎn)生一個新的指向這個對象的指針轻猖,那么就是有兩 個指針指向同一個對象帆吻,這個對象銷毀后兩個指針都應(yīng)該置空。
深拷貝是對一個對象進(jìn)行拷貝咙边,相當(dāng)于對對象進(jìn)行復(fù)制猜煮,產(chǎn)生一個新的對象,那么就有兩個指針分別指向兩個對象败许。當(dāng)一個對象改變或者被銷毀后拷貝出來的新的對象不受影響王带。1.2 實現(xiàn)深拷貝需要實現(xiàn)NSCoying協(xié)議,實現(xiàn)方法
- (id)copyWithZone:(NSZone *)zone
當(dāng)對一個property屬性含有copy修飾符的時候市殷,在進(jìn)行賦值操作的時候?qū)嶋H上就是調(diào)用這個方法愕撰。
1.2.1 父類實現(xiàn)深拷貝之后,子類只要重寫copyWithZone
方法醋寝,在方法內(nèi)部調(diào)用父類的copyWithZone方法搞挣,之后實現(xiàn)自己的屬性的處理
1.2.2 父類沒有實現(xiàn)深拷貝,子類除了需要對自己的屬性進(jìn)行處理音羞,還要對父類的屬性進(jìn)行處理囱桨。**
2. KVO,NSNotification嗅绰,delegate及block區(qū)別
2.1 KVO就是cocoa框架實現(xiàn)的觀察者模式蝇摸,一般同KVC搭配使用,通過KVO可以監(jiān)測一個值的變化办陷,比如View的高度變化。是一對多的關(guān)系律歼,一個值的變化會通知所有的觀察者民镜。
2.2 NSNotification是通知,也是一對多的使用場景险毁。在某些情況下制圈,KVO和NSNotification是一樣的们童,都是狀態(tài)變化之后告知 對方。NSNotification的特點鲸鹦,就是需要被觀察者先主動發(fā)出通知慧库,然后觀察者注冊監(jiān)聽后再來進(jìn)行響應(yīng)院领,比KVO多了發(fā)送通知的一步抽米,但是其優(yōu) 點是監(jiān)聽不局限于屬性的變化病蛉,還可以對多種多樣的狀態(tài)變化進(jìn)行監(jiān)聽弧蝇,監(jiān)聽范圍廣闰歪,使用也更靈活油额。 可以在任何地方發(fā)送通知, 包括子線程和主線程
2.3 delegate 是代理悯舟,就是我不想做的事情交給別人做患整。比如狗需要吃飯眯停,就通過delegate通知主人济舆,主人就會給他做飯、盛飯莺债、倒水滋觉,這些操作,這些狗都不需要關(guān) 心齐邦,只需要調(diào)用delegate(代理人)就可以了椎侠,由其他類完成所需要的操作。所以delegate是一對一關(guān)系侄旬。
2.4 block是delegate的另一種形式肺蔚,是函數(shù)式編程的一種形式。使用場景跟delegate一樣儡羔,相比delegate更靈活宣羊,而且代理的實現(xiàn)更直觀。
2.5 KVO一般的使用場景是數(shù)據(jù)汰蜘,需求是數(shù)據(jù)變化仇冯,比如股票價格變化,我們一般使用KVO(觀察者模式)族操。delegate一般的使用場景是行為苛坚,需求是需要別人幫我做一件事情,比如買賣股票色难,我們一般使用delegate泼舱。Notification 一般是進(jìn)行全局通知,比如利好消息一出枷莉,通知大家去買入娇昙。delegate是強關(guān)聯(lián),就是委托和代理雙方互相知道笤妙,你委托別人買股票你就需要知道經(jīng)紀(jì)人冒掌, 經(jīng)紀(jì)人也不要知道自己的顧客噪裕。Notification是弱關(guān)聯(lián),利好消息發(fā)出股毫,你不需要知道是誰發(fā)的也可以做出相應(yīng)的反應(yīng)膳音,同理發(fā)消息的人也不需要知道 接收的人也可以正常發(fā)出消息。
3. 將一個函數(shù)在主線程執(zhí)行的4種方法
- 3.1 GCD方法铃诬,通過向主線程隊列發(fā)送一個block塊祭陷,使block里的方法可以在主線程中執(zhí)行。
dispatch_async(dispatch_get_main_queue(), ^{
? ? //需要執(zhí)行的方法
});
- 3.2 NSOperation 方法
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];? //主隊列
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
? ? //需要執(zhí)行的方法
}];
[mainQueue addOperation:operation];
- 3.3 NSThread 方法
[self performSelector:@selector(method) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES modes:nil];
[self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES];
[[NSThread mainThread] performSelector:@selector(method) withObject:nil];
- 3.4 RunLoop方法
[[NSRunLoop mainRunLoop] performSelector:@selector(method) withObject:nil];
4. 如何讓計時器調(diào)用一個類方法
- 4.1 計時器只能調(diào)用實例方法氧急,但是可以在這個實例方法里面調(diào)用靜態(tài)方法颗胡。
- 4.2 使用計時器需要注意,計時器一定要加入RunLoop中吩坝,并且選好model才能運行毒姨。scheduledTimerWithTimeInterval方法創(chuàng)建一個計時器并加入到RunLoop中所以可以直接使用。
- 4.3 如果計時器的repeats選擇YES說明這個計時器會重復(fù)執(zhí)行钉寝,一定要在合適的時機調(diào)用計時器的invalid弧呐。不能在dealloc中調(diào)用, 因為一旦設(shè)置為repeats 為yes嵌纲,計時器會強持有self俘枫,導(dǎo)致dealloc永遠(yuǎn)不會被調(diào)用,這個類就永遠(yuǎn)無法被釋放逮走。比如可以在viewDidDisappear中調(diào)用鸠蚪,這 樣當(dāng)類需要被回收的時候就可以正常進(jìn)入dealloc中了。
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
-(void)timerMethod
{
? ? //調(diào)用類方法
? ? [[self class] staticMethod];
}
-(void)invalid
{
? ? [timer invalid];
? ? timer = nil;
}
5. 如何重寫類方法
- 5.1 在子類中實現(xiàn)一個同基類名字一樣的靜態(tài)方法
- 5.2 在調(diào)用的時候不要使用類名調(diào)用师溅,而是使用[self class]的方式調(diào)用茅信。原理,用類名調(diào)用是早綁定墓臭,在編譯期綁定蘸鲸,用[self class]是晚綁定,在運行時決定調(diào)用哪個方法窿锉。
6. NSTimer創(chuàng)建后酌摇,會在哪個線程運行。
- 6.1 用scheduledTimerWithTimeInterval創(chuàng)建的嗡载,在哪個線程創(chuàng)建就會被加入哪個線程的RunLoop中就運行在哪個線程
- 6.2 自己創(chuàng)建的Timer窑多,加入到哪個線程的RunLoop中就運行在哪個線程
7. id和NSObject*的區(qū)別
- 7.1 id是一個 objc_object 結(jié)構(gòu)體指針,定義是
typedef struct objc_object *id
- 7.2 id可以理解為指向?qū)ο蟮闹羔樛莨觥K衞c的對象 id都可以指向埂息,編譯器不會做類型檢查,id調(diào)用任何存在的方法都不會在編譯階段報錯,當(dāng)然如果這個id指向的對象沒有這個方法耿芹,該崩潰還是會崩潰的。
- 7.3 NSObject *指向的必須是NSObject的子類挪哄,調(diào)用的也只能是NSObjec里面的方法否則就要做強制類型轉(zhuǎn)換吧秕。
- 7.4 不是所有的OC對象都是NSObject的子類,還有一些繼承自NSProxy迹炼。NSObject *可指向的類型是id的子集砸彬。
8. iOS 核心框架
- CoreAnimation
- CoreGraphics
- CoreLocation
- AVFoundation
- Foundation
9. iOS核心機制
- UITableView 重用
- ObjC內(nèi)存管理;自動釋放池斯入,ARC如何實現(xiàn)
- runloop
- runtime
- Block的定義砂碉、特性、內(nèi)存區(qū)域刻两、如何實現(xiàn)
- Responder Chain
- NSOperation
10. 數(shù)據(jù)結(jié)構(gòu)
- 8大排序算法
- 二叉樹實現(xiàn)
- 二分查找實現(xiàn)
11. 面向?qū)ο缶幊?/h5>
? 封裝增蹭、繼承、多態(tài)
? 設(shè)計模式6個原則
? 設(shè)計一個類的功能磅摹,如何劃分粒度(單一職責(zé))
? 接口隔離滋迈。
? 如果有一個鳥類,有飛的動作户誓,一個鴕鳥繼承它是合適的嗎(里氏替換)
? 類之間的依賴如何依賴偶合度最斜印(依賴倒轉(zhuǎn))
高層依賴低層,低層不能依賴高層帝美。依賴接口碍彭,不能依賴具體的類。
? 如果A要調(diào)用C函數(shù)悼潭,但C是B的成員類庇忌,應(yīng)該如何設(shè)計?(迪米特)
? 如何設(shè)計類女责,能做到只增加代碼漆枚,而不修改代碼,有哪些經(jīng)驗(開放封閉)
通過設(shè)計模式解決抵知。
12. 計算機技術(shù)
? 計算機網(wǎng)絡(luò): TCP/IP墙基、HTTPCDN、SPDY
? 計算機安全: RSA刷喜、AES残制、DES
? 操作系統(tǒng):線程、進(jìn)程掖疮、堆棧初茶、死鎖、調(diào)度算法
13. iOS新特性浊闪、新技術(shù)
? iOS7 UIDynamic恼布、SpritKit螺戳、新布局、扁平化
? iOS8 應(yīng)用程序擴展折汞、HealthKit倔幼、SceneKit、CoreLocation爽待、TouchID损同、PhotoKit
? iOS9
? Apple Watch
14. 簡述OC中內(nèi)存管理機制.
內(nèi)存管理機制:使用引用計數(shù)管理,分為ARC和MRC,MRC需要程序員自己管理內(nèi)存,ARC則不需要.但是并不是所有對象在ARC環(huán)境下均不需要管理內(nèi)存,子線程和循環(huán)引用并不是這樣.與retain配對使用的是release,retain代表引用計數(shù)+1,release代表引用計數(shù)-1,當(dāng)引用計數(shù)減為0時,對象則被系統(tǒng)自動銷毀.與alloc配對使用的是dealloc,alloc代表為對象開辟內(nèi)存空間,dealloc則代表銷毀對象的內(nèi)存空間.
15.readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak的作用?
讀寫屬性:readonly和readwrite;? 語義屬性:assign/retain/copy; ? 原子性:nonatomic.
15.1 readwrite代表可讀,可寫,即有setter和getter方法,是默認(rèn)屬性.readonly代表只可讀,即只有g(shù)et方法,因為不會生成setter方法,所以它不可以和copy/retain/assign組合使用.
15.2 weak和assign均是弱引用,assign修飾基本數(shù)據(jù)類型,weak修飾對象類型.strong和weak用于ARC下(ARC下的代理使用weak,block塊使用copy).strong相當(dāng)于retain.weak相當(dāng)于assign;assign/retain/copy這些屬性用于指定set訪問器的語義,也就是說,這些屬性決定了以何種方式對數(shù)據(jù)成員賦值.
assign,直接賦值,引用計數(shù)不改變,適用于基本數(shù)據(jù)類型.
retain,淺拷貝,使用的是原來的內(nèi)存空間,只能適用于Objective-C對象類型,而不能適用于Core Foundation對象(retain會增加對象的引用計數(shù),而基本數(shù)據(jù)和Core Foundation對象都沒有引用計數(shù)).
copy:對象的拷貝,新申請一塊內(nèi)存空間,并把原始內(nèi)容復(fù)制到那片空間.新對象的引用計數(shù)為1,此屬性只對那些遵循了NSCopy協(xié)議的對象類型有效.15.3 nonatomic,非原子性訪問,不加同步,是異步操作.默認(rèn)為atomic,原子操作,atomic是Objc使用的一種線程保護(hù)技術(shù),基本上來講,是防止在寫未完成的時候被另外一個線程讀取,造成數(shù)據(jù)錯誤,而這種機制是消耗系統(tǒng)內(nèi)存資源的,所以在移動端,都選擇nonatomic.
16. 內(nèi)存分為5個區(qū),分別是棧區(qū),堆區(qū),全局區(qū),文字常量區(qū),程序代碼區(qū).
- 16.1 棧區(qū):由編譯器自動分配釋放,不需要管理內(nèi)存.
- 16.2 堆區(qū):一般有程序員分配釋放.
- 16.3 全局區(qū):存放全局變量和靜態(tài)變量.
- 16.4 文字常量區(qū):存放常量字符串.
- 16.5 程序代碼區(qū):存放二進(jìn)制代碼.
17. 類變量的@protected,@private,@public,@package,聲明各有什么含義?
- 17.1 @protected 受保護(hù)的.本類,子類可見.
- 17.2 @private 私有的,類內(nèi)可用
- 17.3 @public 公有的,類內(nèi),子類,外部均可用
- 17.4 @package 可見度在@protected和@public之間,這個類型最常用于框架類的實例變量.
18. 線程是什么?進(jìn)程又是什么?區(qū)別和聯(lián)系.
- 18.1 進(jìn)程:正在運行的程序,負(fù)責(zé)程序的內(nèi)存分配.
- 18.2 線程:線程是進(jìn)程中一個獨立執(zhí)行的控制單元(路徑),一個進(jìn)程至少包含一條線程,即主線程.
- 18.3 創(chuàng)建線程的目的:開辟一條新的執(zhí)行路徑,運行指定的代碼,與主線程的代碼實現(xiàn)同時執(zhí)行.
19. 對多線程開發(fā)的理解,iOS中有幾種實現(xiàn)多線程的方式.
- 19.1 多線程的使用場景:防止卡頓,可以同時完成多個任務(wù),且不影響主線程,把耗時操作放在子線程中執(zhí)行,但是會消耗內(nèi)存.
- 19.2 實現(xiàn)多線程的方式:
①.NSThread(內(nèi)存需要自己管理.觸發(fā)),
②.NSOperationQueue(不再關(guān)注線程,當(dāng)前可執(zhí)行任務(wù)個數(shù)queue.maxConcurrentOperationCount)
③.GCD
20. 詳解三種實現(xiàn)多線程的方式
####### 20.1 GCD:
GCD里面包含了串行隊列、并行隊列鸟款、主隊列膏燃、全局隊列.
- 20.1.1 串行隊列
Dispatch_queue_t q = dispatch_queue_create(“qqq”,DISPATCH_QUEUE_SERIAL);//創(chuàng)建一個串行隊列
Dispatch_sync(q,^{
});//開啟同步任務(wù)
Dispatch_async(q,^{
});//開啟異步任務(wù)
- 20.1.2 并行隊列:
DISPATCH_QUEUE_CONCURRENT
- 20.1.3 主隊列:
dispatch_queue_t q = dispatch_get_main_queue();
- 20.1.4 全局隊列:
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
####### 20.2 NSThread
獲取當(dāng)前線程:NSThread * current = [NSThread currentThread];
獲取主線程:NSThread * main = [NSThread mainThread];
使用NSThread創(chuàng)建線程的兩種方式:
- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
暫停當(dāng)前線程:
[NSThread sleepForTimeInterval:2];
20.3 NSOperationQueue
- 20.3.1 創(chuàng)建一個操作隊列:
NSOperationQueue * queue = [[NSOperationQueue alloc]init];
- 20.3.2 添加
NSOperation
到NSOperationQueue
中:[queue addOperation:operation];
- 20.3.3 添加一組operation:
[queue addOperations:operations waitUntilFinished:NO];
- 20.3.4 添加一個block形式的operation:
[queue addOperationWithBlock:^(){
}];
- 20.3.5 添加NSOperation的依賴對象:
[operation2 addDependency:operation1];
- 20.3.6 設(shè)置隊列的最大操作數(shù):
[queue setMaxConcurrentOperationCount:1];
- 20.3.7 等待options完成:
[operation waitUntilFinished];
- 20.3.8 暫停何什、繼續(xù)queue:
[queue setSuspended:YES] [queue setSuspend:NO]
21. 線程同步和異步的區(qū)別?ios中如何實現(xiàn)線程的同步?
同步:任務(wù)順序執(zhí)行,下一個任務(wù)依賴于上一任務(wù)的完成.
異步:任務(wù)執(zhí)行順序不定,一起執(zhí)行.
實現(xiàn):設(shè)置依賴:NSOpreationQueue, ? GCD中的串行隊列.
22. iOS類是否可以多繼承,如果沒有,怎么實現(xiàn)?
- 22.1 不可以多繼承.
- 22.2 可以通過類目,延展,協(xié)議實現(xiàn)多繼承.
- 22.3 類目:類目也叫分類,英文category,在沒有原類.m文件的基礎(chǔ)上,給該類添加方法.類目里不能添加實例變量,不能添加和原始類方法名相同的方法,否則會發(fā)生覆蓋.一個類可以添加多個類目,類目中的方法可以成為原始類的一部分,和原始類方法級別相同,可以被子類繼承.
- 22.4 延展:Extension,是一種特殊形式的類目,主要是在一個類的.m里面聲明與實現(xiàn).作用:就是給某類添加私有方法或者私有變量.
- 22.5 雖然延展是給一個類定義私有方法,但是OC沒有絕對的私有方法,其實還是可以調(diào)用的,延展里面聲明的變量只能在該類內(nèi)部使用,外界訪問不了.如果是新建文件建的的某類延展.h文件,則不能添加實例變量,如果括號里沒有類目名,則認(rèn)為延展里面的方法為全都必須實現(xiàn),如果有,則可選實現(xiàn).
- 22.6 類目寫的方法必須實現(xiàn),延展寫的方法非必須.
23. 棧和堆的區(qū)別?
棧:內(nèi)存系統(tǒng)管理(系統(tǒng)開辟,系統(tǒng)釋放),先進(jìn)后出.
堆:內(nèi)存自己管理(自己開辟,自己釋放).先進(jìn)先出.
24. iOS本地數(shù)據(jù)存儲都有幾種方式?
24.1 NSkeyedArchiver:采用歸檔的形式來保存數(shù)據(jù),該數(shù)據(jù)對象需要遵守NSCoding協(xié)議,并且該對象對應(yīng)的類必須提供encodeWithCoder:和initWithCoder:方法.前一個方法告訴系統(tǒng)怎么對對象進(jìn)行編碼,而后一個方法則是告訴系統(tǒng)怎么對對象進(jìn)行解碼.
24.2 NSUserDefaults:用來保存應(yīng)用程序設(shè)置和屬性,用戶保存的數(shù)據(jù).用戶再次打開程序或者開機后這些數(shù)據(jù)仍然存在.NSUserDefaults可以存儲的數(shù)據(jù)類型包括:NSData,NSString,NSNumber,NSDate,NSArray.NSDictionary,其他類型的數(shù)據(jù)需要先行轉(zhuǎn)換.
24.3 Write寫入方式:永久保存在磁盤中.具體:a.獲得文件保存的路徑.b.生成該路徑下的文件,c,往文件中寫入數(shù)據(jù).d.從文件中讀出數(shù)據(jù).
24.4 SQLite:采用SQLite數(shù)據(jù)庫來存儲數(shù)據(jù),SQLite作為一種輕量級數(shù)據(jù)庫.具體:
a.添加SQLite相關(guān)的庫以及頭文件,
b.使用數(shù)據(jù)庫存數(shù)據(jù):打開數(shù)據(jù)庫,編寫數(shù)據(jù)庫語句,執(zhí)行,關(guān)閉數(shù)據(jù)庫.
另:寫入數(shù)據(jù)庫,字符串可以采用char方式,而從數(shù)據(jù)庫中取出char類型,當(dāng)char類型有表示中文字符時,會出現(xiàn)亂碼,這是因為數(shù)據(jù)庫默認(rèn)使用ascII編碼方式,所以想要正確從數(shù)據(jù)庫中取出中文,需要使用NSString來接受從數(shù)據(jù)庫取出的字符串.24.5 CoreData:原理是對SQLite的封裝,開發(fā)者不需要接觸sql語句,就可以對數(shù)據(jù)庫進(jìn)行操作.
25. ios動態(tài)類型和動態(tài)綁定
多態(tài):父類指針指向子類對象.
動態(tài)類型:只有在運行期,才能確定其真正類型.
動態(tài)加載:根據(jù)不同的條件,加載不同的資源.32和64位.
26. 深拷貝和淺拷貝的理解.
深拷貝;拷貝的內(nèi)容.
淺拷貝:拷貝的指針.
深拷貝如:
NSMutableDictionary? * dic = [@{} mutableCopy];
NSMutableArray? * ary = [@[] mutableCopy];
27. 怎么實現(xiàn)一個singleton的類.
單例是一種設(shè)計模式,對象只有一個.缺點:對象不會被釋放,如果創(chuàng)建很多的話會占用很多內(nèi)存,優(yōu)點:可以當(dāng)做工具類使用.
static SortDetailsModelDown * single = nil;
+(SortDetailsModelDown *)shareSortDetailsModelDown{
?? ?
? ? @synchronized(self){
?? ? ? ?
? ? ? ? if (!single) {
?? ? ? ? ? ?
? ? ? ? ? ? single = [[SortDetailsModelDown alloc]init];
?? ? ? ? ? ?
? ? ? ? }
?? ? ? ?
? ? }
? ? return single;
}
28. 什么是安全釋放?
先釋放再置空.
29. RunLoop是什么?
事件循環(huán),是線程里面的一個組件.主線程的RunLoop是自動開啟的.分為:計時源(timer source),事件源(輸入源):input source.防止CPU中斷(保證程序執(zhí)行的線程不會被系統(tǒng)終止).
Runloop提供了一種異步執(zhí)行代碼的機制,并不能并行執(zhí)行任務(wù),是事件接收和分發(fā)機制的一個實現(xiàn).每一個線程都有其對應(yīng)的RunLoop,但是默認(rèn)非主線程的RunLoop是沒有運行的,需要為RunLoop添加至少一個事件源,然后run它.
一般情況下我們是沒有必要去啟動線程的RunLoop的,除非你在一個單獨的線程中需要長時間的檢測某個事件.
RunLoop,正如其名所示,是線程進(jìn)入和被線程用來響應(yīng)事件以及調(diào)用事件處理函數(shù)的地方.
input source傳遞異步事件,通常是來自其他線程和不同程序的消息.
timer source傳遞同步事件.
當(dāng)有事件發(fā)生時,RunLoop會根據(jù)具體的事件類型通知應(yīng)用程序作出響應(yīng).
當(dāng)沒有事件發(fā)生時,RunLoop會進(jìn)入休眠狀態(tài),從而到達(dá)省電的目的.
當(dāng)事件再次發(fā)生時,RunLoop會被重新喚醒,處理事件.
一般在開發(fā)中很少會主動創(chuàng)建RunLoop,而通常會把事件添加到RunLoop中.
30. 什么是序列化和反序列化,可以用來做什么?如何在OC中實現(xiàn)復(fù)雜對象的存儲.
序列化和反序列化:歸檔和反歸檔,進(jìn)行本地化,進(jìn)行數(shù)據(jù)存儲.
CoreData:數(shù)據(jù)托管.有四種存儲方式:xml,sqlite,二進(jìn)制,內(nèi)存.
遵循NSCoding協(xié)議之后,進(jìn)行歸檔即可實現(xiàn)復(fù)雜對象的存儲.
31. 寫一個標(biāo)準(zhǔn)宏MIN,這個宏輸入兩個參數(shù)并返回較小的一個.
#define MIN(A,B) (A)>(B)?(B):(A)
32. iPhone OS 有沒有垃圾回收機制,簡易闡述一下OC內(nèi)存管理.
木有.引用計數(shù),ARC和MRC,swift(自動引用計數(shù)).
33. 簡述應(yīng)用程序按HOME鍵進(jìn)入后臺時的生命周期,以及從后臺進(jìn)入前臺時的生命周期.
- 33.1 HOME鍵進(jìn)入后臺時:
- (void)applicationWillResignActive:(UIApplication *)application
- (void)applicationDidEnterBackground:(UIApplication *)application
- 33.2 后臺進(jìn)入前臺時:
- (void)applicationWillEnterForeground:(UIApplication *)application
- (void)applicationDidBecomeActive:(UIApplication *)application
- 33.3 各個程序運行狀態(tài)時代理的回調(diào):
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
告訴代理進(jìn)程啟動但還沒進(jìn)入狀態(tài)保存
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
告訴代理啟動基本完成程序準(zhǔn)備開始運行
- (void)applicationWillResignActive:(UIApplication *)application
當(dāng)應(yīng)用程序?qū)⒁敕腔顒訝顟B(tài)執(zhí)行组哩,在此期間,應(yīng)用程序不接收消息或事件富俄,比如來電話了
- (void)applicationDidBecomeActive:(UIApplication *)application
當(dāng)應(yīng)用程序入活動狀態(tài)執(zhí)行禁炒,這個剛好跟上面那個方法相反
- (void)applicationDidEnterBackground:(UIApplication *)application
當(dāng)程序被推送到后臺的時候調(diào)用。所以要設(shè)置后臺繼續(xù)運行霍比,則在這個函數(shù)里面設(shè)置即可
- (void)applicationWillEnterForeground:(UIApplication *)application
當(dāng)程序從后臺將要重新回到前臺時候調(diào)用幕袱,這個剛好跟上面的那個方法相反。
- (void)applicationWillTerminate:(UIApplication *)application
當(dāng)程序?qū)⒁顺鍪潜徽{(diào)用悠瞬,通常是用來保存數(shù)據(jù)和一些退出前的清理工作们豌。這個需要要設(shè)置UIApplicationExitsOnSuspend的鍵值。
- (void)applicationDidFinishLaunching:(UIApplication*)application
當(dāng)程序載入后執(zhí)行
在上面8個方法對應(yīng)的方法中鍵入NSLog打印浅妆。
- 33.4 啟動程序
lifeCycle[40428:11303] willFinishLaunchingWithOptions
lifeCycle[40428:11303] didFinishLaunchingWithOptions
lifeCycle[40428:11303] applicationDidBecomeActive
- 33.5 按下home鍵
lifeCycle[40428:11303] applicationWillResignActive
lifeCycle[40428:11303] applicationDidEnterBackground
- 33.6 雙擊home鍵望迎,再打開程序
lifeCycle[40428:11303] applicationWillEnterForeground
lifeCycle[40428:11303] applicationDidBecomeActive
34.ViewControlleralloc
,loadView
,viewDidLoad
,viewWillAppear
,viewDidUnload
,dealloc
,init
分別是在什么時候調(diào)用?在自定義ViewController
的時候這幾個函數(shù)里面應(yīng)該做什么工作?
- alloc:申請內(nèi)存時調(diào)用.
- loadView:加載視圖時調(diào)用.
- viewDidLoad;視圖已經(jīng)加載后調(diào)用.
- viewWillAppear:視圖將要出現(xiàn)時調(diào)用.
- viewDidUnload:視圖已經(jīng)加載但是沒有加載出來時調(diào)用.
- dealloc:銷毀該視圖時調(diào)用.
- init;初始化該視圖時調(diào)用.
35. 描述應(yīng)用程序的啟動順序.
a.程序入口main函數(shù)創(chuàng)建UIApplication
實例和UIApplication
代理實例.
b.在UIApplication
代理實例中重寫啟動方法,設(shè)置根ViewController
c.在第一ViewController
中添加控件,實現(xiàn)應(yīng)用程序界面.
36. 為什么很多內(nèi)置類如UITableViewControl的delegate屬性都是assign而不是retain?
防止循環(huán)引用. 如:對象A引用了對象B,對象B引用了對象C,對象C引用了對象B,這個時候B的引用計數(shù)是2,而C的引用計數(shù)是1,當(dāng)A不再使用B的時候,就釋放了B的所有權(quán),這個時候C還引用對象B,所以B不會釋放,引用計數(shù)為1,因為B也引用著對象C,B不釋放,那么C也就不會被釋放,所以他們的引用計數(shù)都為1,并且永遠(yuǎn)不會被釋放,形成了循環(huán)引用.
37. .使用UITableView的時候必須要實現(xiàn)的幾種方法?
2個數(shù)據(jù)源方法.分別是:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
38. 寫一個遍歷構(gòu)造器.
+(id)leftModelWith{
? ? leftModel * model = [self alloc]init];
? ? return model;
}
39. UIImage初始化一張圖片有幾種方法?簡述其特點?
3種,
imageNamed
:系統(tǒng)會先檢查系統(tǒng)緩存中是否有該名字的image,如果有的話,則直接返回,如果沒有,則先加載圖像到緩存,然后再返回.
initWithContentsOfFile
:系統(tǒng)不會檢查緩存,而直接從文件系統(tǒng)中記載并返回.
imageWithCGImage:scale:orientation
當(dāng)scale= 1的時候圖像為原始大小,orientation指定繪制圖像的方向.
40. person的retainCount值,并解釋為什么?
Person * per = [Person alloc]init];
self.person = per;
1或者2.看person是什么類型修飾的.
alloc+1,assign+0,retain+1.
41. 下面這段代碼有何問題?
@implementation Person
- (void)setAge:(int)newAge {
?? ?
? ? self.age = newAge;
?? ?
}
@end
死循環(huán)
42. 這段代碼有什么問題,如何修改
for (int i = 0; i < someLargeNumber; i++) {
?? ?
? ? NSString *string = @”Abc”;
?? ?
? ? string = [string lowercaseString];
?? ?
? ? string = [string stringByAppendingString:@"xyz"];
?? ?
? ? NSLog(@“%@”, string);
?? ?
}
加入自動釋放池@autoreleasepool{};
for (int i = 0; i < someLargeNumber; i++) {
?? ?
? ? @antoreleasepool {
?? ? ? ?
? ? ? ? NSString *string = @”Abc”;
?? ? ? ?
? ? ? ? string = [string lowercaseString];
?? ? ? ?
? ? ? ? string = [string stringByAppendingString:@"xyz"];
?? ? ? ?
? ? ? ? NSLog(@“%@”, string);
?? ? ? ?
? ? }
?? ?
}
43. 截取字符串"20 | http://www.baidu.com"中,"|"字符前面和后面的數(shù)據(jù)凌外,分別輸出它們辩尊。
["20 | [http://www.baidu.com](http://www.baidu.com/)" componentSeparatedByString:@"|"];
44. 用obj-c 寫一個冒泡排序.
NSMutableArray *ary = [@[@"1", @"2", @"3", @"4", @"6", @"5"] mutableCopy];
for (int i = 0; i < ary.count - 1; i++) {
?? ?
? ? for (int j = 0; j < ary.count - i - 1; j++) {
?? ? ? ?
? ? ? ? if ([ary[j] integerValue] < [ary[j + 1] integerValue]) {
?? ? ? ? ? ?
? ? ? ? ? ? [ary exchangeObjectAtIndex:j withObjectAtIndex:j + 1];
?? ? ? ? ?
? ? ? ? }
? ? }
?? ?
}
NSLog(@"%@", ary);
45. 簡述對UIView.UIWindow和CALayer的理解.
- UIWindow是應(yīng)用的窗口,繼承于UIResponder.
- UIView繼承于UIView,是創(chuàng)建窗口中的一個視圖,可以響應(yīng)交互事件.一個程序只有一個主window,可以有多個window.
- CALayer圖層,一個view可有多個圖層,不可以響應(yīng)事件.
46. 寫一個完整的代理,包括聲明,實現(xiàn).
代理:遵守協(xié)議的對象.
@class MyView;
第一步:指定協(xié)議:(協(xié)議名:類名+Delegate)
@protocol MyViewDelegate <NSObject>
@required
-(void)changeViewBackgroudColor:(MyView *)view;
@optional
-(void)test;
@end
@interface MyView : UIView
第二步:指定代理
@property (nonatomic,assign)id<MyView> delegate;
@end
第三步:代理遵循協(xié)議.
第四步:代理實現(xiàn)協(xié)議里面的必須實現(xiàn)的方法和其他可選方法.
第五步:委托方通知代理開始執(zhí)行方法.
47. 分析json.xml的區(qū)別,底層如何實現(xiàn)?
Json:鍵值對.數(shù)據(jù)小,不復(fù)雜.便于解析,有框架支持,適合輕量級傳輸.作為數(shù)據(jù)包個數(shù)傳輸?shù)臅r候效率更高.
xml:標(biāo)簽套內(nèi)容.xml數(shù)據(jù)兩較大,比較復(fù)雜.適合大數(shù)據(jù)量的傳輸.xml有豐富的編碼工具,比如:Dom4j,JDom.解析方式有兩種,一是通過文芳模型解析,另外一種遍歷節(jié)點.
48. ViewController的didReceiveMemoryWarning是在什么時候被調(diào)用的?
1.當(dāng)應(yīng)用程序的內(nèi)存使用接近系統(tǒng)的最大內(nèi)存使用時,應(yīng)用會向系統(tǒng)發(fā)送內(nèi)存警告,這時候系統(tǒng)會調(diào)用方法向所有ViewController發(fā)送內(nèi)存警告.
2.打開系統(tǒng)相機.
3.加載高清圖片.
默認(rèn)操作:把里面沒有用的對象進(jìn)行釋放.
49. 面向?qū)ο蟮娜筇卣?簡單介紹.
封裝:代碼模塊化,方便以后調(diào)用.
繼承:子類繼承父類的所有方法和屬性.
多態(tài):父類指針指向子類對象.
50. 重寫一個NSString類型的,retain方式聲明name屬性的setter和getter方法.
屬性的三大特性:語義特性,原子特性,讀寫特性.
同時重寫setter和getter方法,@synchronized name = _name,關(guān)聯(lián)屬性和實例變量.
- (void)setName:(NSString *)name{
?? ?
? ? if(_name != name){
?? ? ? ?
? ? ? ? [_name retain];
?? ? ? ?
? ? ? ? [_name release];
?? ? ? ?
? ? ? ? _name = name;
?? ? ? ?
? ? }
?? ?
}
- (NSString *)name{
?? ?
? ? return [[_name retain]autorelease];
?? ?
}
51. 簡述NotificationCenter.KVC,KVO,Delegate?并說明它們之間的區(qū)別?
NotificationCenter:消息中心.消息通知.
KVC:利用鍵-值間接訪問類中的某個屬性.
[self setValue:@"123" forKeyPath:@"name"];
NSLog(@"%@",[self valueForKeyPath:@"name"]);
KVO:利用鍵-路徑間接訪問類中的某個屬性,也就是觀察者模式(KVO+通知中心).基于KVC和通知中心,觀察的是實例變量.
Delegate:用于多個類之間的傳值.
52. 對MVC的理解,好處?
MVC:是一種架構(gòu).model:數(shù)據(jù)處理,view:視圖顯示,controller:邏輯控制,負(fù)責(zé)視圖和模型之間的通信.
高類聚,低耦合,提高代碼的復(fù)用性.
53. 監(jiān)測鍵盤的彈出.
**通知. **
[[NSNotificationCenter defaultCenter]addObserver:self ? selector:@selector()? name:UIKeyboardWillShowNotification? object:nil];
54. 5個ios,sdk庫和第三方庫.
- 系統(tǒng)庫:UIKit框架:負(fù)責(zé)應(yīng)用程序的圖形及事件驅(qū)動的關(guān)鍵基礎(chǔ),如:用戶界面管理,圖形和窗口支持.
- Mapkit框架:地圖.
- Message UI框架:電子郵件
- AV Foundation框架:可用于音頻播放.
- OpenAL框架:用于播放,可播放高質(zhì),高性能的網(wǎng)絡(luò)音頻
- Core Data框架:將數(shù)據(jù)存儲在SQLite數(shù)據(jù)庫.
- Core Media框架:播放視頻.
- 第三方:SDWebImage :簡化圖片處理
- ShareSDK? ? 分享
- SVProgressHUD ? 輕量級菊花
- AFNetworkin? 方便網(wǎng)絡(luò)開發(fā)
- FreeStreamer? 播放音頻
55. 傳值方式:
通知,單例,代理,屬性,block.
56. NSString * test = [[NSData alloc] init]
,test在編譯時和運行時分別是什么類型的對象?
編譯時是NSString,運行時是NSData.NSData
57. OC中對象的交互是如何實現(xiàn)的?
消息機制.
58. 給定一個字符串,判斷字符串中是否還有png,有就刪除.
stringContains
使用@""直接替換實現(xiàn)刪除
59. 目標(biāo)-動作機制.
**Target - action **
60. 什么是沙盒?沙盒里包含哪些文件,如何獲取文件路徑.
沙盒:程序可操作的磁盤空間,系統(tǒng)為之開辟.
包含了3個文件夾.
1.Documents:存放一些比較重要的文件,但是放入Documents中的文件不能過大.
2.Library :是一個資源庫,存儲一些不太重要的數(shù)據(jù).里面包含了兩個子文件夾,Caches文件夾,用于緩存,
Preferences文件夾,系統(tǒng)偏好設(shè)置,用戶對應(yīng)用程序的設(shè)置,如密碼.perferences路徑無法找到,只能通過NSUserDefaults.
如:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
61. 介紹一下XMPP?
基于XML的點對點通訊協(xié)議,實現(xiàn)通訊功能.
優(yōu)點:可以跨平臺開發(fā).
缺點:丟包,只能發(fā)文字(圖片發(fā)送發(fā)的是鏈接).
62.應(yīng)用程序如何省電?
獲取請求不能過頻.優(yōu)化算法.
63. 寫一個遞歸方法,計算n的階乘.
-(NSInteger)digui:(NSInteger)i{
?? ?
? ? if (i>0) {
?? ? ? ?
? ? ? ? return i*[self digui:(i-1)];
?? ? ? ?
? ? }else{
?? ? ? ?
? ? ? ? return 1;
?? ? ? ?
? ? }
?? ?
}
[[NSUserDefaults standardUserDefaults]setObject:@([self digui:3]) forKey:@"value"];
64. 取出一個數(shù)組中的重復(fù)元素.
1.放進(jìn)集
2.遍歷刪除
3.放進(jìn)字典作為key,再取出key
65. isKindOfClass,isMemberOfClass作用分別是什么?
isKindOfClass是某個類的實例或者子類的實例.
isMemberOfClass是某個類的實例
66. 請分別寫出SEL,id的意思?
SEL:選擇器.
id:范類型
OC中的對象就是C語言的指針.
67. iPhone上,能被應(yīng)用程序直接調(diào)用的系統(tǒng)程序是什么?
能:相冊,相機,通訊錄,音樂.
不能:計算器,天氣,日歷,指南針.
68. 說說后臺如何運行程序.
在plist配置Application does not run in background設(shè)置NO(默認(rèn)就是NO)的前提下.
添加required background modes,值是App registers for location updates和App plays auto or streams audio/video using AirPlay
69. sizeof和strlen的區(qū)別和聯(lián)系?
sizeof:占用空間大小.
strlen:字符串大小.
70. sprintf,strcpy,memcpy的功能?使用上要注意哪些地方?
sprintf:將某些類型轉(zhuǎn)換成字符串類型
strcpy:拷貝字符串,會越界,'/0'
memcpy:拷貝內(nèi)存
71. 寫一個函數(shù)實現(xiàn)strlen的功能?
int sl(const char *s)
{
?? ?
? ? int length = 0;
?? ?
? ? while (*s!='') {
?? ? ? ?
? ? ? ? s++;
?? ? ? ?
? ? ? ? length++;
?? ? ? ?
? ? }
?? ?
? ? return length;
?? ?
}
72. 寫一個代碼片實現(xiàn)輸入一個字符串"20130322152830",輸出一個NSDate類型的對象,打印該對象輸出2013-03-11 15:28:32
NSString * str = @"20130322152832";
NSDateFormatter * format = [[NSDateFormatter alloc]init];
format.dateFormat = @"yyyyMMddHHmmss";//設(shè)置格式
NSLog(@"%@",[[format dateFromString:str] dateByAddingTimeInterval:8*60*60]);
73. cocoa和 cocoa touch?
cocoa包含F(xiàn)oundation和AppKit框架,可用于開發(fā)Mac OS X系統(tǒng)的應(yīng)用程序
cocoa touch包含F(xiàn)oundation和UIKit框架康辑,可用于開發(fā)iPhone OS 系統(tǒng)的應(yīng)用程序
Cocoa時Mac OS X的開發(fā)環(huán)境摄欲,cocoa Touch是 Iphone OS的開發(fā)環(huán)境
74. 網(wǎng)絡(luò)從下往上分為幾層?
從下往上:物理層疮薇、數(shù)據(jù)鏈路層胸墙、網(wǎng)絡(luò)層、傳輸層按咒、會話層迟隅、表示層、應(yīng)用層。
IP 協(xié)議對應(yīng)網(wǎng)絡(luò)層智袭,TCP 協(xié)議對應(yīng)傳輸層奔缠,HTTP 協(xié)議對應(yīng)于應(yīng)用層。
socket 則是對 TCP/IP協(xié)議的封裝和應(yīng)用吼野。也可以說添坊,TCP/IP協(xié)議是傳輸層協(xié)議,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸箫锤,而 HTTTP 是應(yīng)用層協(xié)議,主要解決
75. 多線程的底層實現(xiàn)雨女?
線程:進(jìn)程中一個特立獨行的控制單元(路徑)谚攒。多線程:一個進(jìn)程至少有一個線程,即主線程氛堕。
①馏臭、Mach 是第一個以多線程方式處理任務(wù)的系統(tǒng),因此多線程的底層實現(xiàn)機制就是基于 Mach 的線程讼稚。
②括儒、開發(fā)中很少用到 Mach 級的線程,因為 Mach級的線程沒有提供多線程的基本特征锐想,線程之間是獨立的帮寻。
?、開發(fā)中實現(xiàn)多線程的方案:
NSThread赠摇、GCD固逗、NSOperationQueue.NSOperation
76. 線程之間怎么通信?
①.performSelect:onThread:withObject:waitUntilDone:
②.NSMachPort
77. 網(wǎng)絡(luò)圖片問題中怎么解決一個相同的網(wǎng)絡(luò)地址重復(fù)請求的問題.
利用字典:圖片地址為 key, 下載操作為 value.value
78. 用 NSOperation和 NSOperationQueue處理 A.B.C三個線程,要求執(zhí)行完 A.B 后才能執(zhí)行?
//創(chuàng)建隊列
NSOperationQueue * queue = [[NSOperationQueue alloc]init];
//創(chuàng)建三個操作
NSOperation * A = [NSBlockOperation blockOperationWithBlock:^{
?? ?
? ? NSLog{@"A"};
?? ?
}];
NSOperation * B = [NSBlockOperation blockOperationWithBlock:^{
?? ?
? ? NSLog{@"B"};
?? ?
}];
NSOperation * C = [NSBlockOperation blockOperationWithBlock:^{
?? ?
? ? NSLog{@"C"};
?? ?
}];
// 添加依賴
[C addDependency:a];
[C addDependency:b];
//執(zhí)行操作
[queue addOperation:a];
[queue addOperation:b];
[queue addOperation:c];
79. GCD內(nèi)部怎么實現(xiàn)的?
①.iOS和 OSX 的核心是 XNU 內(nèi)核, GCD是基于 XNU 內(nèi)核實現(xiàn)的(是由蘋果電腦發(fā)展起來的操作系統(tǒng)內(nèi)核).
②.GCD 的 API 全部在 libdispatch 庫中.
③.GCD 底層實現(xiàn)主要有 Dispatch Queue(管理 block)和 Dispatch Source(處理事件).
80. 怎么保證多人開發(fā)進(jìn)行內(nèi)存泄露檢查。
使用Analuze進(jìn)行代碼的靜態(tài)分析藕帜,為避免麻煩烫罩,多人開發(fā)盡量使用ARC.
81. 非自動內(nèi)存管理情況下怎么做單例模式。
創(chuàng)建一個單例對象的靜態(tài)實例洽故,并初始化為nil贝攒。
創(chuàng)建一個類的類工廠方法,當(dāng)且僅當(dāng)這個類的實例為nil時生成一個類的實例时甚。
實現(xiàn)NScopying協(xié)議隘弊,覆蓋allocWithZone:方法,確保用戶在直接分配對象時撞秋,不會產(chǎn)生另一個對象长捧。
覆蓋release、autorelease吻贿、retain串结、retainCount方法,確保單例的狀態(tài)。
82. 對于類方法(靜態(tài)方法)默認(rèn)是autorelease的肌割,所有類方法都會這樣嗎卧蜓?
系統(tǒng)自帶的絕大數(shù)類方法返回的對象,都是經(jīng)過autorelease.
83. block在ARC中和MRC中的方法有何區(qū)別把敞?需要注意什么弥奸?
①.對于沒有引用外部變量的Block,無論在ARC還是MRC下奋早,類型都是NSGlobalBlock,這種類型的block可以理解為一種全局的block,不需要考慮作用域的問題盛霎。同時,對它進(jìn)行Copy和Retain操作也是無效的耽装。
②.避免循環(huán)引用愤炸。
根據(jù)isa指針,block一共有3種類型的block
_NSConcreteGlobalBlock 全局靜態(tài)
_NSConcreteStackBlock 保存在棧中掉奄,出函數(shù)作用域就銷毀
_NSConcreteMallocBlock 保存在堆中规个,retainCount == 0銷毀
84. 什么情況下會發(fā)生內(nèi)存泄露和內(nèi)存溢出?
當(dāng)程序在申請內(nèi)存后姓建,無法釋放已經(jīng)申請的內(nèi)存空間(例如一個對象或者變量在用完后沒有釋放诞仓,這個對象就一直占用著內(nèi)存),一次內(nèi)存泄露可以忽略速兔,但如果泄露過多的話墅拭,就會造成內(nèi)存溢出。
當(dāng)程序在申請內(nèi)存時涣狗,但存入了更大的數(shù)據(jù)帜矾,出現(xiàn)內(nèi)存溢出。
85. [NSArray arrayWithobject<id>]這個方法添加對象后屑柔,需要對這個數(shù)組進(jìn)行釋放操作嗎屡萤?
不需要,這個對象會被放到自動釋放池中掸宛。
86. 自動釋放池如何實現(xiàn)死陆?
自動釋放池以棧的形式實現(xiàn),當(dāng)你創(chuàng)建一個新的自動釋放池時唧瘾,它將被添加到棧頂措译,當(dāng)一個對象收到發(fā)送autorelease消息時,它將添加到當(dāng)前線程的處于棧頂?shù)淖詣俞尫懦刂惺涡颍?dāng)自動釋放池被回收時领虹,它們從棧中被刪除并且會給池子里所有對象都做一次release操作。
87. KVO內(nèi)部實現(xiàn)原理求豫?
①.KVO是基于runtime機制實現(xiàn)的塌衰。
②.當(dāng)某個類的對象第一次被觀察時诉稍,系統(tǒng)就會在運行期動態(tài)的創(chuàng)建該類的一個派生類,在這個派生類中重寫基類中任何被觀察屬性的setter方法最疆。
派生類在被重寫setter方法中實現(xiàn)了真正的通知機制杯巨。(Person->NSKVONotification Person)
88. 能否把比較耗時的操作放在NSNotificationCenter中。
如果在異步線程發(fā)出的通知努酸,那么就可以把耗時操作放到NSNotificationCenter
中
如果在主線程發(fā)的通知服爷,那么就不可以把耗時操作放到NSNotificationCenter
中。
89. Foundation對象與Core Foundation對象有何區(qū)別获诈?
Foundation對象是OC的仍源,Core Foundation對象是C對象。
數(shù)據(jù)類型之間的轉(zhuǎn)換:
** ARC:** _bridge_retained舔涎、_bridge_transfer
** 非ARC:** _bridge
90. 不用第三變量镜会,交換AB的值。
A=A+B
B=A-B
A=A-B
或者
A=A^B
B=A^B
A=A^B
91. 簡單描述下對單例模式設(shè)計的理解终抽?
節(jié)省內(nèi)存資源,一個應(yīng)用就一個對象桶至。
92. runtime實現(xiàn)的機制是什么昼伴?怎么用,一般用于干嘛镣屹。
運行時機制圃郊,runtime庫里面包含了跟類、成員變量女蜈、方法相關(guān)的API持舆,比如獲取類里面的所有成員變量,為類動態(tài)添加成員變量伪窖、動態(tài)改變類的方法實現(xiàn)逸寓,為類動態(tài)添加新的方法等,需要導(dǎo)入<objc/message.h><objc/message.h>
①.runtime,運行時機制覆山,它是一套C語言庫竹伸。
②.實際上我們編寫的所有OC代碼,最終都是轉(zhuǎn)換成為了runtime庫的東西簇宽,比如類轉(zhuǎn)換成了runtime庫里面的結(jié)構(gòu)體等數(shù)據(jù)類型勋篓,方法轉(zhuǎn)換成了runtime庫里面的C語言函數(shù),平時調(diào)方法都是轉(zhuǎn)成了objc_msgSend函數(shù)(所以說OC有個消息發(fā)送機制)
③魏割、因此譬嚣,可以說runtime是OC的底層實現(xiàn),是OC的幕后執(zhí)行者钞它。
④拜银、有了runtime庫殊鞭,能做什么呢?可以獲取類里面的所有成員變量盐股、為類動態(tài)的添加成員變量钱豁、動態(tài)的改變類的方法實現(xiàn)、為類動態(tài)添加新的方法等等疯汁。
93. 是否使用Core Text 或者 Core Image 牲尺?
Core Text
隨意修改文本的樣式
圖文混排(純C語言)
Core Image(濾鏡處理)
能夠調(diào)節(jié)圖片的各種屬性(對比度、色溫幌蚊、色差等)
94. NSNotification和KVO的區(qū)別和用法是什么谤碳?什么時候應(yīng)該使用通知,什么時候應(yīng)該使用KVO,他們的實現(xiàn)有何區(qū)別溢豆?如果用protocol和delegate來實現(xiàn)類似的功能可能嗎蜒简?可能的話有何問題?不可能的話why漩仙?
通知比較靈活搓茬,一個通知能被多個對象接受,一個對象可以接受多個通知队他。
代理不交規(guī)范卷仑,但是代碼較多(默認(rèn)是一對一)
KVO性能不好(底層會產(chǎn)生新的類),只能監(jiān)聽某個對象屬性的變化麸折,不推薦使用锡凝。
95. 怎么解決緩存池滿的問題?
iOS中不存在緩存池滿的情況垢啼,通常在對象需要創(chuàng)建時才創(chuàng)建窜锯,比如UITableView中一般只會創(chuàng)建剛開始在屏幕中的cell,之后都是從緩存池里取芭析,不會再創(chuàng)建新對象
96. 控制器View的生命周期及相關(guān)函數(shù)是什么锚扎?你在開發(fā)中是如何使用的?
1馁启、首先判斷控制器是否有視圖工秩,如果沒有就調(diào)用loadView方法創(chuàng)建:通過storyBoard或者代碼。
2进统、隨后調(diào)用viewDidLoad助币,可以進(jìn)行下一步的初始化操作,只會被調(diào)用一次螟碎。
3眉菱、在視圖顯示之前調(diào)用viewWillAppear,該函數(shù)可以多次調(diào)用。
4掉分、視圖viewDidAppear
5俭缓、在布局變化前后克伊,調(diào)用viewWill/DidLayoutSubViews處理相關(guān)信息。
97. 有些圖片加載比較慢怎么處理华坦?你是怎么優(yōu)化程序的性能的愿吹?
①、圖片下載放在異步線程惜姐。
②犁跪、圖片下載過程使用占位圖片。
③歹袁、如果圖片比較大坷衍,可以使用多線程斷點下載。
98. App需要加載大量數(shù)據(jù)条舔,給服務(wù)器發(fā)送請求枫耳,但是服務(wù)器卡住了怎么辦?
設(shè)置請求超時孟抗,給用戶提示請求超時迁杨,根據(jù)用戶操作再次請求。
99. SDWebImage具體如何實現(xiàn)凄硼?
其實就是沙盒緩存機制铅协,主要由三塊組成:內(nèi)存圖片緩存,內(nèi)存操作緩存帆喇,磁盤沙盒緩存。
①亿胸、利用NSOperationQueue和NSOperation下載圖片坯钦,還使用了GCD(解析GIF圖片)。
②侈玄、利用URL作為key婉刀,NSOperation作為value.
③、利用URL作為key序仙,UIImage作為value
100. AFNetWorking實現(xiàn)原理突颊。
基于NSURL.采用block的方法處理請求,直接返回的是json潘悼、XML數(shù)據(jù)律秃。AFN直接操作對象是AFHTTPClient,是一個實現(xiàn)了NSCoding和NSCopying協(xié)議的NSObject子類。AFGTTPClient是一個封裝了一系列操作方法的工具類治唤。AFN默認(rèn)沒有封裝同步請求棒动,如果開發(fā)者需要使用同步請求,需要重寫相關(guān)的方法(getPath:parameters:failure)宾添,對AFHTTPRequestOperation進(jìn)行同步處理船惨。
101. 什么是響應(yīng)鏈柜裸,它是怎么工作的?
http://www.reibang.com/p/9179e5d780c8
有兩種方法可以訪問私有屬性,一種是通過KVC獲取,一種是通過runtime訪問并修改私有屬性
創(chuàng)建一個Father類,聲明一個私有屬性name,并重寫description打印name的值,在另外一個類中通過runtime來獲取并修改Father中的屬性
@interface Father ()
@property (nonatomic, copy) NSString *name;
@end
@implementation Father
- (NSString *)description
{
? ? return [NSString stringWithFormat:@"name:%@",_name];
}
@implementation ViewController
- (void)viewDidLoad {
?? ?
? ? [super viewDidLoad];
?? ?
? ? Father *father = [Father new];
? ? // count記錄變量的數(shù)量IVar是runtime聲明的一個宏
? ? unsigned int count = 0;
? ? // 獲取類的所有屬性變量
? ? Ivar *menbers = class_copyIvarList([Father class], &count);
?? ?
? ? for (int i = 0; i < count; i++) {
? ? ? ? Ivar ivar = menbers[i];
? ? ? ? // 將IVar變量轉(zhuǎn)化為字符串,這里獲得了屬性名
? ? ? ? const char *memberName = ivar_getName(ivar);
? ? ? ? NSLog(@"%s",memberName);
?? ? ? ?
? ? ? ? Ivar m_name = menbers[0];
? ? ? ? // 修改屬性值
? ? ? ? object_setIvar(father, m_name, @"zhangsan");
? ? ? ? // 打印后發(fā)現(xiàn)Father中name的值變?yōu)閦hangsan
? ? ? ? NSLog(@"%@",[father description]);
? ? }
?? ?
}
102. iOS Extension 是什么粱锐?能列舉幾個常用的 Extension 么疙挺?
Extension是擴展,沒有分類名字,是一種特殊的分類,類擴展可以擴展屬性,成員變量和方法
常用的擴展是在.m文件中聲明私有屬性和方法,這里不知道還哪些,請大家補充
如何把一個包含自定義對象的數(shù)組序列化到磁盤?
自定義對象只需要實現(xiàn)NSCoding協(xié)議即可
- (void)viewDidLoad
{
? ? [super viewDidLoad];
?? ?
? ? User *user = [User new];
? ? Account *account = [Account new];
? ? NSArray *userArray = @[user, account];
? ? // 存到磁盤
? ? NSData * tempArchive = [NSKeyedArchiver archivedDataWithRootObject: userArray];
}
// 代理方法
- (instancetype)initWithCoder:(NSCoder *)coder
{
? ? self = [super initWithCoder:coder];
? ? if (self) {
? ? ? ? self.user = [aDecoder decodeObjectForKey:@"user"];
? ? ? ? self.account = [aDecoder decodeObjectForKey:@"account"];
? ? }
? ? return self;
}
// 代理方法
-(void)encodeWithCoder:(NSCoder *)aCoder{
? ? [aCoder encodeObject:self.user forKey:@"user"];
? ? [aCoder encodeObject:self.account forKey:@"account"];
}
103. iOS 的沙盒目錄結(jié)構(gòu)是怎樣的怜浅? App Bundle 里面都有什么铐然?
沙盒結(jié)構(gòu)
Application:存放程序源文件,上架前經(jīng)過數(shù)字簽名海雪,上架后不可修改
Documents:常用目錄锦爵,iCloud備份目錄,存放數(shù)據(jù),這里不能存緩存文件,否則上架不被通過
Library
Caches:存放體積大又不需要備份的數(shù)據(jù),SDWebImage緩存路徑就是這個
Preference:設(shè)置目錄奥裸,iCloud會備份設(shè)置信息
tmp:存放臨時文件险掀,不會被備份,而且這個文件下的數(shù)據(jù)有可能隨時被清除的可能
104. App Bundle 里面有什么
Info.plist:此文件包含了應(yīng)用程序的配置信息.系統(tǒng)依賴此文件以獲取應(yīng)用程序的相關(guān)信息
可執(zhí)行文件:此文件包含應(yīng)用程序的入口和通過靜態(tài)連接到應(yīng)用程序target的代碼
資源文件:圖片,聲音文件一類的
其他:可以嵌入定制的數(shù)據(jù)資源
105. iOS 的簽名機制大概是怎樣的湾宙?
假設(shè)樟氢,我們有一個APP需要發(fā)布,為了防止中途篡改APP內(nèi)容侠鳄,保證APP的完整性埠啃,以及APP是由指定的私鑰發(fā)的。首先伟恶,先將APP內(nèi)容通過摘要算法碴开,得到摘要,再用私鑰對摘要進(jìn)行加密得到密文博秫,將源文本潦牛、密文、和私鑰對應(yīng)的公鑰一并發(fā)布即可挡育。那么如何驗證呢巴碗?
驗證方首先查看公鑰是否是私鑰方的,然后用公鑰對密文進(jìn)行解密得到摘要即寒,將APP用同樣的摘要算法得到摘要橡淆,兩個摘要進(jìn)行比對,如果相等那么一切正常母赵。這個過程只要有一步出問題就視為無效逸爵。
iOS 7的多任務(wù)添加了哪兩個新的 API? 各自的使用場景是什么?
后臺獲劝汲啊(Background Fetch):后臺獲取使用場景是用戶打開應(yīng)用之前就使app有機會執(zhí)行代碼來獲取數(shù)據(jù)痊银,刷新UI。這樣在用戶打開應(yīng)用的時候施绎,最新的內(nèi)容將已然呈現(xiàn)在用戶眼前溯革,而省去了所有的加載過程贞绳。
推送喚醒(Remote Notifications):使用場景是使設(shè)備在接收到遠(yuǎn)端推送后讓系統(tǒng)喚醒設(shè)備和我們的后臺應(yīng)用,并先執(zhí)行一段代碼來準(zhǔn)備數(shù)據(jù)和UI致稀,然后再提示用戶有推送冈闭。這時用戶如果解鎖設(shè)備進(jìn)入應(yīng)用后將不會再有任何加載過程,新的內(nèi)容將直接得到呈現(xiàn)抖单。
106. NSOperation 相比于 GCD 有哪些優(yōu)勢萎攒?
提供了在 GCD 中不那么容易復(fù)制的有用特性。
可以很方便的取消一個NSOperation的執(zhí)行
可以更容易的添加任務(wù)的依賴關(guān)系
提供了任務(wù)的狀態(tài):isExecuteing, isFinished.
107. strong / weak / unsafe_unretained 的區(qū)別矛绘?
weak只能修飾OC對象,使用weak不會使計數(shù)器加1,對象銷毀時修飾的對象會指向nil
strong等價與retain,能使計數(shù)器加1,且不能用來修飾數(shù)據(jù)類型
unsafe_unretained等價與assign,可以用來修飾數(shù)據(jù)類型和OC對象,但是不會使計數(shù)器加1,且對象銷毀時也不會將對象指向nil,容易造成野指針錯誤
108. 如何為 Class 定義一個對外只讀對內(nèi)可讀寫的屬性?
在頭文件中將屬性定義為readonly,在.m文件中將屬性重新定義為readwrite
Objective-C 中耍休,meta-class 指的是什么?
meta-class 是 Class 對象的類,為這個Class類存儲類方法,當(dāng)一個類發(fā)送消息時,就去那個類對應(yīng)的meta-class中查找那個消息,每個Class都有不同的meta-class,所有的meta-class都使用基類的meta-class(假如類繼承NSObject,那么他所對應(yīng)的meta-class也是NSObject)作為他們的類
109. UIView 和 CALayer 之間的關(guān)系货矮?
UIView顯示在屏幕上歸功于CALayer羊精,通過調(diào)用drawRect方法來渲染自身的內(nèi)容,調(diào)節(jié)CALayer屬性可以調(diào)整UIView的外觀囚玫,UIView繼承自UIResponder喧锦,CALayer不可以響應(yīng)用戶事件
UIView是iOS系統(tǒng)中界面元素的基礎(chǔ),所有的界面元素都繼承自它抓督。它內(nèi)部是由Core Animation來實現(xiàn)的燃少,它真正的繪圖部分额嘿,是由一個叫CALayer(Core Animation Layer)的類來管理检盼。UIView本身,更像是一個CALayer的管理器奖磁,訪問它的根繪圖和坐標(biāo)有關(guān)的屬性定铜,如frame阳液,bounds等,實際上內(nèi)部都是訪問它所在CALayer的相關(guān)屬性
UIView有個layer屬性宿稀,可以返回它的主CALayer實例趁舀,UIView有一個layerClass方法赖捌,返回主layer所使用的類祝沸,UIView的子類,可以通過重載這個方法越庇,來讓UIView使用不同的CALayer來顯示
110. frame 和 bounds 的區(qū)別是什么罩锐?
frame相對于父視圖,是父視圖坐標(biāo)系下的位置和大小。bounds相對于自身,是自身坐標(biāo)系下的位置和大小卤唉。
frame以父控件的左上角為坐標(biāo)原點涩惑,bounds以自身的左上角為坐標(biāo)原點
111.如何把一張大圖縮小為1/4大小的縮略圖?
let data = UIImageJPEGRepresentation(image, 0.25)