面試 (一) : 基礎篇-1

父類實現(xiàn)深拷貝時甘邀,子類如何實現(xiàn)深度拷貝。父類沒有實現(xiàn)深拷貝時垮庐,子類如何實現(xiàn)深度拷貝:

? 深拷貝同淺拷貝的區(qū)別:淺拷貝是指針拷貝松邪,對一個對象進行淺拷貝,相當于對指向對象的指針進行復制哨查,產(chǎn)生一個新的指向這個對象的指針逗抑,那么就是有兩個指針指向同一個對象,這個對象銷毀后兩個指針都應該置空寒亥。深拷貝是對一個對象進行拷貝邮府,相當于對對象進行復制,產(chǎn)生一個新的對象溉奕,那么就有兩個指針分別 指向兩個對象褂傀。當一個對象改變或者被銷毀后拷貝出來的新的對象不受影響。

? 實現(xiàn)深拷貝需要實現(xiàn)NSCoying協(xié)議加勤,實現(xiàn)- (id)copyWithZone:(NSZone *)zone 方法仙辟。當對一個property屬性含有copy修飾符的時候,在進行賦值操作的時候實際上就是調用這個方法鳄梅。

? 父類實現(xiàn)深拷貝之后叠国,子類只要重寫copyWithZone方法,在方法內部調用父類的copyWithZone方法卫枝,之后實現(xiàn)自己的屬性的處理

? 父類沒有實現(xiàn)深拷貝煎饼,子類除了需要對自己的屬性進行處理,還要對父類的屬性進行處理校赤。

KVO吆玖,NSNotification,delegate及block區(qū)別
? KVO就是cocoa框架實現(xiàn)的觀察者模式马篮,一般同KVC搭配使用沾乘,通過KVO可以監(jiān)測一個值的變化,比如View的高度變化浑测。是一對多的關系翅阵,一個值的變化會通知所有的觀察者歪玲。

? NSNotification是通知,也是一對多的使用場景掷匠。在某些情況下婆芦,KVO和NSNotification是一樣的怯疤,都是狀態(tài)變化之后告知對方羹幸。NSNotification的特點勇吊,就是需要被觀察者先主動發(fā)出通知,然后觀察者注冊監(jiān)聽后再來進行響應顽决,比KVO多了發(fā)送通知的一步短条,但是其優(yōu) 點是監(jiān)聽不局限于屬性的變化,還可以對多種多樣的狀態(tài)變化進行監(jiān)聽才菠,監(jiān)聽范圍廣茸时,使用也更靈活。

? delegate 是代理赋访,就是我不想做的事情交給別人做可都。比如狗需要吃飯,就通過delegate通知主人蚓耽,主人就會給他做飯汹粤、盛飯、倒水田晚,這些操作,這些狗都不需要關 心国葬,只需要調用delegate(代理人)就可以了贤徒,由其他類完成所需要的操作。所以delegate是一對一關系汇四。

? block是delegate的另一種形式接奈,是函數(shù)式編程的一種形式。使用場景跟delegate一樣通孽,相比delegate更靈活序宦,而且代理的實現(xiàn)更直觀。

? KVO一般的使用場景是數(shù)據(jù)背苦,需求是數(shù)據(jù)變化互捌,比如股票價格變化,我們一般使用KVO(觀察者模式)行剂。delegate一般的使用場景是行為秕噪,需求是需要別人幫我做一件事情,比如買賣股票厚宰,我們一般使用delegate腌巾。

Notification 一般是進行全局通知遂填,比如利好消息一出,通知大家去買入澈蝙。delegate是強關聯(lián)吓坚,就是委托和代理雙方互相知道,你委托別人買股票你就需要知道經(jīng)紀人灯荧, 經(jīng)紀人也不要知道自己的顧客礁击。Notification是弱關聯(lián),利好消息發(fā)出漏麦,你不需要知道是誰發(fā)的也可以做出相應的反應客税,同理發(fā)消息的人也不需要知道 接收的人也可以正常發(fā)出消息。

將一個函數(shù)在主線程執(zhí)行的4種方法
? GCD方法撕贞,通過向主線程隊列發(fā)送一個block塊更耻,使block里的方法可以在主線程中執(zhí)行。
dispatch_async(dispatch_get_main_queue(), ^{
需要執(zhí)行的方法
});

? NSOperation 方法
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; 主隊列
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
需要執(zhí)行的方法
}];
[mainQueue addOperation:operation];

? 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];

? RunLoop方法
[[NSRunLoop mainRunLoop] performSelector:@selector(method) withObject:nil];

如何讓計時器調用一個類方法
? 計時器只能調用實例方法捏膨,但是可以在這個實例方法里面調用靜態(tài)方法秧均。
? 使用計時器需要注意,計時器一定要加入RunLoop中号涯,并且選好model才能運行目胡。scheduledTimerWithTimeInterval方法創(chuàng)建一個計時器并加入到RunLoop中所以可以直接使用。
? 如果計時器的repeats選擇YES說明這個計時器會重復執(zhí)行链快,一定要在合適的時機調用計時器的invalid誉己。不能在dealloc中調用, 因為一旦設置為repeats 為yes域蜗,計時器會強持有self巨双,導致dealloc永遠不會被調用,這個類就永遠無法被釋放霉祸。比如可以在viewDidDisappear中調用筑累,這 樣當類需要被回收的時候就可以正常進入dealloc中了。
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
-(void)timerMethod
{
調用類方法
[[self class] staticMethod];
}
-(void)invalid
{
[timer invalid];
timer = nil;
}

如何重寫類方法
? 1丝蹭、在子類中實現(xiàn)一個同基類名字一樣的靜態(tài)方法
? 2慢宗、在調用的時候不要使用類名調用,而是使用[self class]的方式調用奔穿。原理镜沽,用類名調用是早綁定,在編譯期綁定贱田,用[self class]是晚綁定淘邻,在運行時決定調用哪個方法。

NSTimer創(chuàng)建后湘换,會在哪個線程運行宾舅。
? 用scheduledTimerWithTimeInterval創(chuàng)建的统阿,在哪個線程創(chuàng)建就會被加入哪個線程的RunLoop中就運行在哪個線程
? 自己創(chuàng)建的Timer,加入到哪個線程的RunLoop中就運行在哪個線程筹我。

id和NSObject*的區(qū)別
? id是一個 objc_object 結構體指針扶平,定義是typedef struct objc_object *id
? id可以理解為指向對象的指針。所有oc的對象 id都可以指向蔬蕊,編譯器不會做類型檢查结澄,id調用任何存在的方法都不會在編譯階段報錯,當然如果這個id指向的對象沒有這個方法岸夯,該崩潰還是會崩潰的麻献。
? NSObject *指向的必須是NSObject的子類,調用的也只能是NSObjec里面的方法否則就要做強制類型轉換猜扮。
? 不是所有的OC對象都是NSObject的子類勉吻,還有一些繼承自NSProxy。NSObject *可指向的類型是id的子集旅赢。
以下內容后續(xù)補充

iOS 核心框架
? CoreAnimation
? CoreGraphics
? CoreLocation
? AVFoundation
? Foundation

iOS核心機制
? UITableView 重用
? ObjC內存管理齿桃;自動釋放池,ARC如何實現(xiàn)
? runloop
? runtime
? Block的定義煮盼、特性短纵、內存區(qū)域、如何實現(xiàn)
? Responder Chain
? NSOperation

? GCD
數(shù)據(jù)結構
? 8大排序算法
? 二叉樹實現(xiàn)
? 二分查找實現(xiàn)

面向對象編程
? 封裝僵控、繼承香到、多態(tài)
? 設計模式6個原則
? 設計一個類的功能,如何劃分粒度(單一職責)
? 接口隔離报破。
? 如果有一個鳥類养渴,有飛的動作,一個鴕鳥繼承它是合適的嗎(里氏替換)
? 類之間的依賴如何依賴偶合度最蟹豪印(依賴倒轉)
高層依賴低層,低層不能依賴高層翘紊。依賴接口蔽氨,不能依賴具體的類。
? 如果A要調用C函數(shù)帆疟,但C是B的成員類鹉究,應該如何設計?(迪米特法則)
? 如何設計類踪宠,能做到只增加代碼自赔,而不修改代碼,有哪些經(jīng)驗(開放封閉)
通過設計模式解決柳琢。

計算機技術
? 計算機網(wǎng)絡:TCP/IP绍妨、HTTPCDN润脸、SPDY
? 計算機安全:RSA、AES他去、DES
? 操作系統(tǒng):線程毙驯、進程、堆棧灾测、死鎖爆价、調度算法

iOS新特性、新技術
? iOS7 UIDynamic媳搪、SpritKit铭段、新布局、扁平化
? iOS8 應用程序擴展秦爆、HealthKit序愚、SceneKit、CoreLocation鲜结、TouchID展运、PhotoKit
? iOS9
? Apple Watch

? 第三方庫:SDWebImage、AFNetwork精刷、JSONKit拗胜、wax

**********************筆記**********************


簡述OC中內存管理機制.
答:內存管理機制:使用引用計數(shù)管理,分為ARC和MRC,MRC需要程序員自己管理內存,ARC則不需要.但是并不是所有對象在ARC環(huán)境下均不需要管理內存,子線程和循環(huán)引用并不是這樣.與retain配對使用的是release,retain代表引用計數(shù)+1,release代表引用計數(shù)-1,當引用計數(shù)減為0時,對象則被系統(tǒng)自動銷毀.與alloc配對使用的是dealloc,alloc代表為對象開辟內存空間,dealloc則代表銷毀對象的內存空間.

2.readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak的作用?
答:讀寫屬性:readonly和readwrite; 語義屬性:assign/retain/copy; 原子性:nonatomic.

①.readwrite代表可讀,可寫,即有setter和getter方法,是默認屬性.readonly代表只可讀,即只有get方法,因為不會生成setter方法,所以它不可以和copy/retain/assign組合使用.

②.weak和assign均是弱引用,assign修飾基本數(shù)據(jù)類型,weak修飾對象類型.strong和weak用于ARC下(ARC下的代理使用weak,block塊使用copy).strong相當于retain.weak相當于assign;assign/retain/copy這些屬性用于指定set訪問器的語義,也就是說,這些屬性決定了以何種方式對數(shù)據(jù)成員賦值.

assign,直接賦值,引用計數(shù)不改變,適用于基本數(shù)據(jù)類型.

retain,淺拷貝,使用的是原來的內存空間,只能適用于Objective-C對象類型,而不能適用于Core Foundation對象(retain會增加對象的引用計數(shù),而基本數(shù)據(jù)和Core Foundation對象都沒有引用計數(shù)).

copy:對象的拷貝,新申請一塊內存空間,并把原始內容復制到那片空間.新對象的引用計數(shù)為1,此屬性只對那些遵循了NSCopy協(xié)議的對象類型有效.

③.nonatomic,非原子性訪問,不加同步,是異步操作.默認為atomic,原子操作,atomic是Objc使用的一種線程保護技術,基本上來講,是防止在寫未完成的時候被另外一個線程讀取,造成數(shù)據(jù)錯誤,而這種機制是消耗系統(tǒng)內存資源的,所以在移動端,都選擇nonatomic.

3.內存分為5個區(qū),分別是棧區(qū),堆區(qū),全局區(qū),文字常量區(qū),程序代碼區(qū).

棧區(qū):由編譯器自動分配釋放,不需要管理內存.
堆區(qū):一般有程序員分配釋放.
全局區(qū):存放全局變量和靜態(tài)變量.
常量區(qū):存放常量字符串.
代碼區(qū):存放二進制代碼.

3.類變量的@protected,@private,@public,@package,聲明各有什么含義?
@protected 受保護的.本類,子類可見.
@private 私有的,類內可用
@public 公有的,類內,子類,外部均可用
@package 可見度在@protected和@public之間,這個類型最常用于框架類的實例變量.

4.線程是什么?進程又是什么?區(qū)別和聯(lián)系.
進程:正在運行的程序,負責程序的內存分配.
線程:線程是進程中一個獨立執(zhí)行的控制單元(路徑),一個進程至少包含一條線程,即主線程.
創(chuàng)建線程的目的:開辟一條新的執(zhí)行路徑,運行指定的代碼,與主線程的代碼實現(xiàn)同時執(zhí)行.

5.對多線程開發(fā)的理解,iOS中有幾種實現(xiàn)多線程的方式.
多線程的使用場景:防止卡頓,可以同時完成多個任務,且不影響主線程,把耗時操作放在子線程中執(zhí)行,但是會消耗內存.
實現(xiàn)多線程的方式:
①.NSThread(內存需要自己管理.觸發(fā)),
②.NSOperationQueue(不再關注線程,當前可執(zhí)行任務個數(shù)queue.maxConcurrentOperationCount)
③.GCD
④:Theard

詳解三種實現(xiàn)多線程的方式:
GCD:

GCD里面包含了串行隊列、并行隊列怒允、主隊列埂软、全局隊列。

Dispatch_queue_t q = dispatch_queue_create(“qqq”,DISPATCH_QUEUE_SERIAL);創(chuàng)建一個串行隊列

Dispatch_sync(q,^{

});開啟同步任務

Dispatch_async(q,^{

});開啟異步任務

并行隊列:DISPATCH_QUEUE_CONCURRENT

主隊列:dispatch_queue_t q = dispatch_get_main_queue();

全局隊列:dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
NSThread

獲取當前線程: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;

暫停當前線程:

[NSThread sleepForTimeInterval:2];
NSOperationQueue

創(chuàng)建一個操作隊列:NSOperationQueue * queue = [[NSOperationQueue alloc]init];

添加NSOperation到NSOperationQueue中:[queue addOperation:operation];

添加一組operation:[queue addOperations:operations waitUntilFinished:NO];

添加一個block形式的operation:[queue addOperationWithBlock:^(){

}];

添加NSOperation的依賴對象:[operation2 addDependency:operation1];

設置隊列的最大操作數(shù):[queue setMaxConcurrentOperationCount:1];

等待options完成:[operation waitUntilFinished];

暫停纫事、繼續(xù)queue:[queue setSuspended:YES] [queue setSuspend:NO]

6.線程同步和異步的區(qū)別?ios中如何實現(xiàn)線程的同步?

同步:任務順序執(zhí)行,下一個任務依賴于上一任務的完成.

異步:任務執(zhí)行順序不定,一起執(zhí)行.

實現(xiàn):設置依賴:NSOpreationQueue GCD中的串行隊列.

7.iOS類是否可以多繼承,如果沒有,怎么實現(xiàn)?

不可以多繼承.可以通過類目,延展,協(xié)議實現(xiàn)多繼承.

類目:類目也叫分類,英文category,在沒有原類.m文件的基礎上,給該類添加方法.類目里不能添加實例變量,不能添加和原始類方法名相同的方法,否則會發(fā)生覆蓋.一個類可以添加多個類目,類目中的方法可以成為原始類的一部分,和原始類方法級別相同,可以被子類繼承.

延展:Extension,是一種特殊形式的類目,主要是在一個類的.m里面聲明與實現(xiàn).作用:就是給某類添加私有方法或者私有變量.

雖然延展是給一個類定義私有方法,但是OC沒有絕對的私有方法,其實還是可以調用的,延展里面聲明的變量只能在該類內部使用,外界訪問不了.如果是新建文件建的的某類延展.h文件,則不能添加實例變量,如果括號里沒有類目名,則認為延展里面的方法為全都必須實現(xiàn),如果有,則可選實現(xiàn).

類目寫的方法必須實現(xiàn),延展寫的方法非必須.

8.棧和堆的區(qū)別?
棧:內存系統(tǒng)管理(系統(tǒng)開辟,系統(tǒng)釋放),先進后出.
堆:內存自己管理(自己開辟,自己釋放).先進先出.

9.iOS本地數(shù)據(jù)存儲都有幾種方式?
①.NSkeyedArchiver:采用歸檔的形式來保存數(shù)據(jù),該數(shù)據(jù)對象需要遵守NSCoding協(xié)議,并且該對象對應的類必須提供encodeWithCoder:和initWithCoder:方法.前一個方法告訴系統(tǒng)怎么對對象進行編碼,而后一個方法則是告訴系統(tǒng)怎么對對象進行解碼.

②.NSUserDefaults:用來保存應用程序設置和屬性,用戶保存的數(shù)據(jù).用戶再次打開程序或者開機后這些數(shù)據(jù)仍然存在.NSUserDefaults可以存儲的數(shù)據(jù)類型包括:NSData,NSString,NSNumber,NSDate,NSArray.NSDictionary,其他類型的數(shù)據(jù)需要先行轉換.

③.Write寫入方式:永久保存在磁盤中.具體:a.獲得文件保存的路徑.b.生成該路徑下的文件,c,往文件中寫入數(shù)據(jù).d.從文件中讀出數(shù)據(jù).

④.SQLite:采用SQLite數(shù)據(jù)庫來存儲數(shù)據(jù),SQLite作為一種輕量級數(shù)據(jù)庫.具體:a.添加SQLite相關的庫以及頭文件,b.使用數(shù)據(jù)庫存數(shù)數(shù)據(jù):打開數(shù)據(jù)庫,編寫數(shù)據(jù)庫語句,執(zhí)行,關閉數(shù)據(jù)庫.另:寫入數(shù)據(jù)庫,字符串可以采用char方式,而從數(shù)據(jù)庫中取出char類型,當char類型有表示中文字符時,會出現(xiàn)亂碼,這是因為數(shù)據(jù)庫默認使用ascII編碼方式,所以想要正確從數(shù)據(jù)庫中取出中文,需要使用NSString來接受從數(shù)據(jù)庫取出的字符串.

⑤.CoreData:原理是對SQLite的封裝,開發(fā)者不需要接觸sql語句,就可以對數(shù)據(jù)庫進行操作.

10.ios動態(tài)類型和動態(tài)綁定
多態(tài):父類指針指向子類對象.
動態(tài)類型:只有在運行期,才能確定其真正類型.
動態(tài)加載:根據(jù)不同的條件,加載不同的資源.32和64位.

11.深拷貝和淺拷貝的理解.
深拷貝;拷貝的內容.
淺拷貝:拷貝的指針.

深拷貝如:
NSMutableDictionary * dic = [@{} mutableCopy];
NSMutableArray * ary = [@[] mutableCopy];

12.怎么實現(xiàn)一個單例的類.

單例是一種設計模式,對象只有一個.缺點:對象不會被釋放,如果創(chuàng)建很多的話會占用很多內存,優(yōu)點:可以當做工具類使用.

static SortDetailsModelDown * single = nil;

+(SortDetailsModelDown *)shareSortDetailsModelDown{

@synchronized(self){
    
    if (!single) {
        
        single = [[SortDetailsModelDown alloc]init];
        
    }
    
}

return single;

}

13.什么是安全釋放?
先釋放再置空.

14.RunLoop是什么?
事件循環(huán),是線程里面的一個組件.主線程的RunLoop是自動開啟的.分為:計時源(timer source),事件源(輸入源):input source.防止CPU中斷(保證程序執(zhí)行的線程不會被系統(tǒng)終止).

Runloop提供了一種異步執(zhí)行代碼的機制,并不能并行執(zhí)行任務,是事件接收和分發(fā)機制的一個實現(xiàn).每一個線程都有其對應的RunLoop,但是默認非主線程的RunLoop是沒有運行的,需要為RunLoop添加至少一個事件源,然后run它.

一般情況下我們是沒有必要去啟動線程的RunLoop的,除非你在一個單獨的線程中需要長時間的檢測某個事件.

RunLoop,正如其名所示,是線程進入和被線程用來響應事件以及調用事件處理函數(shù)的地方.

input source傳遞異步事件,通常是來自其他線程和不同程序的消息.

timer source傳遞同步事件.

當有事件發(fā)生時,RunLoop會根據(jù)具體的事件類型通知應用程序作出響應.

當沒有事件發(fā)生時,RunLoop會進入休眠狀態(tài),從而到達省電的目的.

當事件再次發(fā)生時,RunLoop會被重新喚醒,處理事件.

一般在開發(fā)中很少會主動創(chuàng)建RunLoop,而通常會把事件添加到RunLoop中.

15.什么是序列化和反序列化,可以用來做什么?如何在OC中實現(xiàn)復雜對象的存儲.
序列化和反序列化:歸檔和反歸檔,進行本地化,進行數(shù)據(jù)存儲.
CoreData:數(shù)據(jù)托管.有四種存儲方式:xml,sqlite,二進制,內存.
遵循NSCoding協(xié)議之后,進行歸檔即可實現(xiàn)復雜對象的存儲.

16.寫一個標準宏MIN,這個宏輸入兩個參數(shù)并返回較小的一個.

define MIN(A,B) (A)>(B)?(B):(A)

17.iPhone OS 有沒有垃圾回收機制,簡易闡述一下OC內存管理.
木有.引用計數(shù),ARC和MRC,swift(自動引用計數(shù)).

18.簡述應用程序按HOME鍵進入后臺時的生命周期,以及從后臺進入前臺時的生命周期.
前者:- (void)applicationWillResignActive:(UIApplication *)application

  • (void)applicationDidEnterBackground:(UIApplication *)application

后者:- (void)applicationWillEnterForeground:(UIApplication *)application

  • (void)applicationDidBecomeActive:(UIApplication *)application

另:
各個程序運行狀態(tài)時代理的回調:

  • (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

告訴代理進程啟動但還沒進入狀態(tài)保存

  • (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

告訴代理啟動基本完成程序準備開始運行

  • (void)applicationWillResignActive:(UIApplication *)application

當應用程序將要入非活動狀態(tài)執(zhí)行勘畔,在此期間,應用程序不接收消息或事件丽惶,比如來電話了

  • (void)applicationDidBecomeActive:(UIApplication *)application

當應用程序入活動狀態(tài)執(zhí)行炫七,這個剛好跟上面那個方法相反

  • (void)applicationDidEnterBackground:(UIApplication *)application

當程序被推送到后臺的時候調用。所以要設置后臺繼續(xù)運行钾唬,則在這個函數(shù)里面設置即可

  • (void)applicationWillEnterForeground:(UIApplication *)application

當程序從后臺將要重新回到前臺時候調用万哪,這個剛好跟上面的那個方法相反。

  • (void)applicationWillTerminate:(UIApplication *)application

當程序將要退出是被調用抡秆,通常是用來保存數(shù)據(jù)和一些退出前的清理工作奕巍。這個需要要設置UIApplicationExitsOnSuspend的鍵值。

  • (void)applicationDidFinishLaunching:(UIApplication*)application

當程序載入后執(zhí)行

在上面8個方法對應的方法中鍵入NSLog打印儒士。

現(xiàn)在啟動程序看看執(zhí)行的順序:

啟動程序

lifeCycle[40428:11303] willFinishLaunchingWithOptions

lifeCycle[40428:11303] didFinishLaunchingWithOptions

lifeCycle[40428:11303] applicationDidBecomeActive

按下home鍵

lifeCycle[40428:11303] applicationWillResignActive

lifeCycle[40428:11303] applicationDidEnterBackground

雙擊home鍵的止,再打開程序

lifeCycle[40428:11303] applicationWillEnterForeground

lifeCycle[40428:11303] applicationDidBecomeActive

19.ViewController
alloc,loadView,viewDidLoad,viewWillAppear,viewDidUnload,dealloc,init分別是在什么時候調用?在自定義ViewController的時候這幾個函數(shù)里面應該做什么工作?

alloc:申請內存時調用.

loadView:加載視圖時調用.

viewDidLoad;視圖已經(jīng)加載后調用.

viewWillAppear:視圖將要出現(xiàn)時調用.

dealloc:銷毀該視圖時調用.

init;初始化該視圖時調用.

20.描述應用程序的啟動順序.
a.程序入口main函數(shù)創(chuàng)建UIApplication實例和UIApplication代理實例.

b.在UIApplication代理實例中重寫啟動方法,設置根ViewController

c.在第一ViewController中添加控件,實現(xiàn)應用程序界面.

21.為什么很多內置類如UITableViewControl的delegate屬性都是assign而不是retain?
防止循環(huán)引用.

如:對象A引用了對象B,對象B引用了對象C,對象C引用了對象B,這個時候B的引用計數(shù)是2,而C的引用計數(shù)是1,當A不再使用B的時候,就釋放了B的所有權,這個時候C還引用對象B,所以B不會釋放,引用計數(shù)為1,因為B也引用著對象C,B不釋放,那么C也就不會被釋放,所以他們的引用計數(shù)都為1,并且永遠不會被釋放,形成了循環(huán)引用.

22.使用UITableView的時候必須要實現(xiàn)的幾種方法?
2個數(shù)據(jù)源方法.分別是:

  • (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

  • (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

23.寫一個遍歷構造器.

+(id)leftModelWith{

leftModel * model = [self alloc]init];

return model;

}

24.UIImage初始化一張圖片有幾種方法?簡述其特點?
3種,
imageNamed:系統(tǒng)會先檢查系統(tǒng)緩存中是否有該名字的image,如果有的話,則直接返回,如果沒有,則先加載圖像到緩存,然后再返回.

initWithContentsOfFile:系統(tǒng)不會檢查緩存,而直接從文件系統(tǒng)中記載并返回.

imageWithCGImage:scale:orientation 當scale= 1的時候圖像為原始大小,orientation指定繪制圖像的方向.

25.person的retainCount值,并解釋為什么?

Person * per = [Person alloc]init];

self.person = per;

1或者2.看person是什么類型修飾的.

alloc+1,assign+0,retain+1.

26.下面這段代碼有何問題?

@implementation Person

  • (void)setAge:(int)newAge {

    self.age = newAge;

}

@end

死循環(huán)

  1. 這段代碼有什么問題,如何修改
    

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);
    
}

}

28.截取字符串"20 | http://www.baidu.com"中,"|"字符前面和后面的數(shù)據(jù)着撩,分別輸出它們诅福。

["20 | http://www.baidu.com" componentSeparatedByString:@"|"];

29.用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);

30.簡述對UIView.UIWindow和CALayer的理解.
UIWindow是應用的窗口,繼承于UIResponder.

UIView繼承于UIView,是創(chuàng)建窗口中的一個視圖,可以響應交互事件.一個程序只有一個主window,可以有多個window.

CALayer圖層,一個view可有多個圖層,不可以響應事件.

31.寫一個完整的代理,包括聲明,實現(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í)行方法.

32.分析json.xml的區(qū)別,底層如何實現(xiàn)?
Json:鍵值對.數(shù)據(jù)小,不復雜.便于解析,有框架支持,適合輕量級傳輸.作為數(shù)據(jù)包個數(shù)傳輸?shù)臅r候效率更高.

xml:標簽套內容.xml數(shù)據(jù)兩較大,比較復雜.適合大數(shù)據(jù)量的傳輸.xml有豐富的編碼工具,比如:Dom4j,JDom.解析方式有兩種,一是通過文芳模型解析,另外一種遍歷節(jié)點.

33.ViewController的didReceiveMemoryWarning是在什么時候被調用的?
1.當應用程序的內存使用接近系統(tǒng)的最大內存使用時,應用會向系統(tǒng)發(fā)送內存警告,這時候系統(tǒng)會調用方法向所有ViewController發(fā)送內存警告.

2.打開系統(tǒng)相機.

3.加載高清圖片.

默認操作:把里面沒有用的對象進行釋放.

34.面向對象的三大特征,簡單介紹.
封裝:代碼模塊化,方便以后調用.

繼承:子類繼承父類的所有方法和屬性.

多態(tài):父類指針指向子類對象.

35.重寫一個NSString類型的,retain方式聲明name屬性的setter和getter方法.
屬性的三大特性:語義特性,原子特性,讀寫特性.

同時重寫setter和getter方法,@synchronized name = _name,關聯(lián)屬性和實例變量.

  • (void)setName:(NSString *)name{

    if(_name != name){

      [_name retain];
      
      [_name release];
      
      _name = name;
    

    }

}

  • (NSString *)name{

    return [[_name retain]autorelease];

}

36.簡述NotificationCenter.KVC,KVO,Delegate?并說明它們之間的區(qū)別?
NotificationCenter:消息中心.消息通知.

KVC:利用鍵-值間接訪問類中的某個屬性.
[self setValue:@"123" forKeyPath:@"name"];
NSLog(@"%@",[self valueForKeyPath:@"name"]);

KVO:利用鍵-路徑間接訪問類中的某個屬性,也就是觀察者模式(KVO+通知中心).基于KVC和通知中心,觀察的是實例變量.

Delegate:用于多個類之間的傳值.

37.What is lazy loading?
懶加載

38.對MVC的理解,好處?
MVC:是一種架構.model:數(shù)據(jù)處理,view:視圖顯示,controller:邏輯控制,負責視圖和模型之間的通信.

高類聚,低耦合,提高代碼的復用性.

39.監(jiān)測鍵盤的彈出.
通知.

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector() name:UIKeyboardWillShowNotification object:nil];

  1. 5個ios,sdk庫和第三方庫.
    系統(tǒng)庫:UIKit框架:負責應用程序的圖形及事件驅動的關鍵基礎,如:用戶界面管理,圖形和窗口支持.

Mapkit框架:地圖.

Message UI框架:電子郵件

AV Foundation框架:可用于音頻播放.

OpenAL框架:用于播放,可播放高質,高性能的網(wǎng)絡音頻

Core Data框架:將數(shù)據(jù)存儲在SQLite數(shù)據(jù)庫.

Core Media框架:播放視頻.

第三方:SDWebImage :簡化圖片處理

ShareSDK 分享

SVProgressHUD 輕量級菊花

AFNetworkin 方便網(wǎng)絡開發(fā)

FreeStreamer 播放音頻

41.介紹響應者鏈.
當用戶點擊屏幕,能夠產(chǎn)生響應的對象組成的鏈.

繼承自NSResponder,響應者鏈能夠中斷.

42.傳值方式:
通知,單例,代理,屬性,block.

43.NSString * test = [[NSData alloc] init],test在編譯時和運行時分別是什么類型的對象?
編譯時是NSString,運行時是NSData.NSData

44.OC中對象的交互是如何實現(xiàn)的?
消息機制.

45.給定一個字符串,判斷字符串中是否還有png,有就刪除.
stringContains匾委,使用@""直接替換實現(xiàn)刪除

46.目標-動作機制.
Target - action

47.什么是沙盒?沙盒里包含哪些文件,如何獲取文件路徑.
沙盒:程序可操作的磁盤空間,系統(tǒng)為之開辟.

包含了3個文件夾.

1.Documents:存放一些比較重要的文件,但是放入Documents中的文件不能過大.

2.Library :是一個資源庫,存儲一些不太重要的數(shù)據(jù).里面包含了兩個子文件夾,Caches文件夾,用于緩存,

Preferences文件夾,系統(tǒng)偏好設置,用戶對應用程序的設置,如密碼.perferences路徑無法找到,只能通過NSUserDefaults.

如:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

48.介紹一下XMPP?
基于XML的點對點通訊協(xié)議,實現(xiàn)通訊功能.

優(yōu)點:可以跨平臺開發(fā).

缺點:丟包,只能發(fā)文字(圖片發(fā)送發(fā)的是鏈接).

49.應用程序如何省電?
獲取請求不能過頻.優(yōu)化算法.

50.寫一個遞歸方法,計算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"];

51.NSArray 和 NSMutableArray 的區(qū)別?多線程下那個更安全.
NSArray: 不可變數(shù)組.

NSMutableArray: 可變數(shù)組.

多線程下NSArray更安全.

52.取出一個數(shù)組中的重復元素.
1.放進集

2.遍歷刪除

3.放進字典作為key,再取出key

54.isKindOfClass,isMemberOfClass作用分別是什么?
isKindOfClass是某個類的實例或者子類的實例.

isMemberOfClass是某個類的實例

55.請分別寫出SEL,id的意思?
SEL:選擇器.
id:范類型
OC中的對象就是C語言的指針.

56.iPhone上,能被應用程序直接調用的系統(tǒng)程序是什么?
能:相冊,相機,通訊錄,音樂.

不能:計算器,天氣,日歷,指南針.

57.以.mm為擴展名的文件里,可以包含哪些代碼?
C++,C,OC

58.說說后臺如何運行程序.
在plist配置Application does not run inbackground設置NO(默認就是NO)的前提下.

添加required background modes,值是App registers for location updates和App plays auto or streams audio/video using AirPlay

59.sizeof和strlen的區(qū)別和聯(lián)系?
sizeof:占用空間大小.
strlen:字符串大小.

60.sprintf,strcpy,memcpy的功能?使用上要注意哪些地方?
sprintf:將某些類型轉換成字符串類型
strcpy:拷貝字符串,會越界,'/0'
memcpy:拷貝內存

61.寫一個函數(shù)實現(xiàn)strlen的功能?
int sl(const char *s)

{

int length = 0;

while (*s!='') {
    
    s++;
    
    length++;
    
}

return length;

}

62.寫一個代碼片實現(xiàn)輸入一個字符串"20130322152830",輸出一個NSDate類型的對象,打印該對象輸出2013-03-11 15:28:32

NSString * str = @"20130322152832";

NSDateFormatter * format = [[NSDateFormatter alloc]init];

format.dateFormat = @"yyyyMMddHHmmss";//設置格式

NSLog(@"%@",[[format dateFromString:str] dateByAddingTimeInterval:86060]);

63.用變量a寫出以下定義

a、一個整型數(shù)int a = 10

b权谁、一個指向整型數(shù)的指針int *p = 10

c剩檀、一個指向指針的指針,它指向的指針是指向一個整型數(shù)int **p =10

d旺芽、一個有10個整型數(shù)的數(shù)組 int a[10]

e沪猴、一個有10個指針的數(shù)組,該指針是指向一個整型數(shù)的int *a[10]

f采章、一個指向有10個整型數(shù)數(shù)組的指針int *a = {1,2,3,4,5,6,7,8,9,10};

g运嗜、一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)悯舟,并返回一個整型數(shù)

int *a(int b){

return b;

}

64.cocoa和 cocoa touch?

cocoa包含F(xiàn)oundation和AppKit框架担租,可用于開發(fā)Mac OS X系統(tǒng)的應用程序

cocoa touch包含F(xiàn)oundation和UIKit框架,可用于開發(fā)iPhone OS 系統(tǒng)的應用程序

Cocoa時Mac OS X的開發(fā)環(huán)境抵怎,cocoa Touch是 Iphone OS的開發(fā)環(huán)境

65.網(wǎng)絡從下往上分為幾層奋救?
從下往上:物理層、數(shù)據(jù)鏈路層反惕、網(wǎng)絡層尝艘、傳輸層、會話層姿染、表示層背亥、應用層。

IP 協(xié)議對應網(wǎng)絡層悬赏,TCP 協(xié)議對應傳輸層狡汉,HTTP 協(xié)議對應于應用層。

socket 則是對TCP/IP協(xié)議的封裝和應用闽颇。也可以說盾戴,TCP/IP協(xié)議是傳輸層協(xié)議,主要解決數(shù)據(jù)如何在網(wǎng)絡中傳輸兵多,而 HTTTP 是應用層協(xié)議尖啡,主要解決

66.熱更新幾種實現(xiàn)方式
http://www.reibang.com/p/8cec322531ae

67.多線程的底層實現(xiàn)?

線程:進程中一個特立獨行的控制單元(路徑)中鼠。多線程:一個進程至少有一個線程,即主線程沿癞。
①援雇、Mach 是第一個以多線程方式處理任務的系統(tǒng),因此多線程的底層實現(xiàn)機制就是基于 Mach 的線程椎扬。

②惫搏、開發(fā)中很少用到 Mach 級的線程具温,因為 Mach級的線程沒有提供多線程的基本特征,線程之間是獨立的筐赔。

④铣猩、開發(fā)中實現(xiàn)多線程的方案:

NSThread、GCD茴丰、NSOperationQueue.NSOperation

68.線程之間怎么通信?

①.performSelect:onThread:withObject:waitUntilDone:

②.NSMachPort

69.網(wǎng)絡圖片問題中怎么解決一個相同的網(wǎng)絡地址重復請求的問題.

利用字典:圖片地址為 key, 下載操作為 value.value

70.用 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];

71.GCD內部怎么實現(xiàn)的?
1 IOS和OS X的核心是XNU內核达皿,GCD是基于XUN內核實現(xiàn)的
2 GCD的API全部在libdispatch庫中
3 GCD的底層實現(xiàn)主要有Dispatch Queue 和Dispatch Source
Dispatch Queue :管理block操作
Dispatch Source :處理事件(比如線程間通信)

72.怎么保證多人開發(fā)進行內存泄露檢查。
使用Analuze進行代碼的靜態(tài)分析贿肩,為避免麻煩峦椰,多人開發(fā)盡量使用ARC.

73、非自動內存管理情況下怎么做單例模式汰规。
創(chuàng)建一個單例對象的靜態(tài)實例汤功,并初始化為nil。

創(chuàng)建一個類的類工廠方法溜哮,當且僅當這個類的實例為nil時生成一個類的實例滔金。

實現(xiàn)NScopying協(xié)議,覆蓋allocWithZone:方法茂嗓,確保用戶在直接分配對象時餐茵,不會產(chǎn)生另一個對象。

覆蓋release在抛、autorelease钟病、retain、retainCount方法刚梭,確保單例的狀態(tài)肠阱。

74、對于類方法(靜態(tài)方法)默認是autorelease的朴读,所有類方法都會這樣嗎屹徘?
①、系統(tǒng)自帶的絕大數(shù)類方法返回的對象衅金,都是經(jīng)過autorelease.

75噪伊、block在ARC中和MRC中的方法有何區(qū)別?需要注意什么氮唯?
①.對于沒有引用外部變量的Block鉴吹,無論在ARC還是MRC下,類型都是NSGlobalBlock,這種類型的block可以理解為一種全局的block,不需要考慮作用域的問題惩琉。同時豆励,對它進行Copy和Retain操作也是無效的。

②.避免循環(huán)引用。

根據(jù)isa指針良蒸,block一共有3種類型的block

_NSConcreteGlobalBlock 全局靜態(tài)

_NSConcreteStackBlock 保存在棧中技扼,出函數(shù)作用域就銷毀

_NSConcreteMallocBlock 保存在堆中,retainCount == 0銷毀

76.什么情況下會發(fā)生內存泄露和內存溢出嫩痰?
當程序在申請內存后剿吻,無法釋放已經(jīng)申請的內存空間(例如一個對象或者變量在用完后沒有釋放,這個對象就一直占用著內存)串纺,一次內存泄露可以忽略丽旅,但如果泄露過多的話,就會造成內存溢出造垛。

當程序在申請內存時魔招,但存入了更大的數(shù)據(jù),出現(xiàn)內存溢出五辽。

77.[NSArray arrayWithobject<id>]這個方法添加對象后办斑,需要對這個數(shù)組進行釋放操作嗎?
不需要杆逗,這個對象會被放到自動釋放池中乡翅。

78.自動釋放池如何實現(xiàn)?
自動釋放池以棧的形式實現(xiàn)罪郊,當你創(chuàng)建一個新的自動釋放池時蠕蚜,它將被添加到棧頂,當一個對象收到發(fā)送autorelease消息時悔橄,它將添加到當前線程的處于棧頂?shù)淖詣俞尫懦刂邪欣郏斪詣俞尫懦乇换厥諘r,它們從棧中被刪除并且會給池子里所有對象都做一次release操作癣疟。

79.KVO內部實現(xiàn)原理挣柬?
①.KVO是基于runtime機制實現(xiàn)的。

②.當某個類的對象第一次被觀察時睛挚,系統(tǒng)就會在運行期動態(tài)的創(chuàng)建該類的一個派生類邪蛔,在這個派生類中重寫基類中任何被觀察屬性的setter方法。

派生類在被重寫setter方法中實現(xiàn)了真正的通知機制扎狱。(Person->NSKVONotification Person)

80.能否把比較耗時的操作放在NSNotificationCenter中侧到。
如果在異步線程發(fā)出的通知,那么就可以把耗時操作放到NSNotificationCenter中
如果在主線程發(fā)的通知淤击,那么就不可以把耗時操作放到NSNotificationCenter中匠抗。

81.Foundation對象與Core Foundation對象有何區(qū)別?
Foundation對象是OC的污抬,Core Foundation對象是C對象汞贸。
數(shù)據(jù)類型之間的轉換:

ARC:_bridge_retained、_bridge_transfer

非ARC:_bridge

82、不用第三變量著蛙,交換AB的值。
A=A+B

B=A-B

A=A-B

或者

A=A^B

B=A^B

A=A^B

83.簡單描述下對單例模式設計的理解耳贬?
節(jié)省內存資源踏堡,一個應用就一個對象。

84.runtime實現(xiàn)的機制是什么咒劲?怎么用顷蟆,一般用于干嘛。
運行時機制腐魂,runtime庫里面包含了跟類帐偎、成員變量、方法相關的API蛔屹,比如獲取類里面的所有成員變量削樊,為類動態(tài)添加成員變量、動態(tài)改變類的方法實現(xiàn)兔毒,為類動態(tài)添加新的方法等漫贞,需要導入<objc/message.h><objc/message.h>

①.runtime,運行時機制,它是一套C語言庫育叁。

②.實際上我們編寫的所有OC代碼迅脐,最終都是轉換成為了runtime庫的東西,比如類轉換成了runtime庫里面的結構體等數(shù)據(jù)類型豪嗽,方法轉換成了runtime庫里面的C語言函數(shù)谴蔑,平時調方法都是轉成了objc_msgSend函數(shù)(所以說OC有個消息發(fā)送機制)

③、因此龟梦,可以說runtime是OC的底層實現(xiàn)隐锭,是OC的幕后執(zhí)行者。

④变秦、有了runtime庫成榜,能做什么呢?可以獲取類里面的所有成員變量蹦玫、為類動態(tài)的添加成員變量赎婚、動態(tài)的改變類的方法實現(xiàn)、為類動態(tài)添加新的方法等等樱溉。

85.是否使用Core Text 或者 Core Image 挣输?
Core Text

隨意修改文本的樣式

圖文混排(純C語言)

Core Image(濾鏡處理)

能夠調節(jié)圖片的各種屬性(對比度、色溫福贞、色差等)

86撩嚼、NSNotification和KVO的區(qū)別和用法是什么?什么時候應該使用通知,什么時候應該使用KVO,他們的實現(xiàn)有何區(qū)別完丽?如果用protocol和delegate來實現(xiàn)類似的功能可能嗎恋技?可能的話有何問題?不可能的話why逻族?

通知比較靈活蜻底,一個通知能被多個對象接受,一個對象可以接受多個通知聘鳞。

代理不交規(guī)范薄辅,但是代碼較多(默認是一對一)

KVO性能不好(底層會產(chǎn)生新的類),只能監(jiān)聽某個對象屬性的變化抠璃,不推薦使用站楚。

87、block內部的實現(xiàn)原理搏嗡。
Objective-C是對C語言的擴展窿春,block的實現(xiàn)是基于指針和函數(shù)指針。

88采盒、怎么解決緩存池滿的問題谁尸?
iOS中不存在緩存池滿的情況,通常在對象需要創(chuàng)建時才創(chuàng)建纽甘,比如UITableView中一般只會創(chuàng)建剛開始在屏幕中的cell良蛮,之后都是從緩存池里取,不會再創(chuàng)建新對象悍赢。

89决瞳、控制器View的生命周期及相關函數(shù)是什么?你在開發(fā)中是如何使用的左权?
1皮胡、首先判斷控制器是否有視圖,如果沒有就調用loadView方法創(chuàng)建:通過storyBoard或者代碼赏迟。

2屡贺、隨后調用viewDidLoad,可以進行下一步的初始化操作锌杀,只會被調用一次甩栈。

3、在視圖顯示之前調用viewWillAppear,該函數(shù)可以多次調用糕再。

4量没、視圖viewDidAppear

5、在布局變化前后突想,調用viewWill/DidLayoutSubViews處理相關信息殴蹄。

90究抓、有些圖片加載比較慢怎么處理呀潭?你是怎么優(yōu)化程序的性能的鳞陨?
①赏殃、圖片下載放在異步線程豫领。

②、圖片下載過程使用占位圖片宅楞。

③落塑、如果圖片比較大朱庆,可以使用多線程斷點下載蛤克。

91.App需要加載大量數(shù)據(jù),給服務器發(fā)送請求夷蚊,但是服務器卡住了怎么辦构挤?
設置請求超時,給用戶提示請求超時惕鼓,根據(jù)用戶操作再次請求筋现。

92、SDWebImage具體如何實現(xiàn)箱歧?
其實就是沙盒緩存機制矾飞,主要由三塊組成:內存圖片緩存,內存操作緩存呀邢,磁盤沙盒緩存洒沦。

①、利用NSOperationQueue和NSOperation下載圖片价淌,還使用了GCD(解析GIF圖片)申眼。

②、利用URL作為key蝉衣,NSOperation作為value.

③括尸、利用URL作為key,UIImage作為value

93病毡、AFNetWorking實現(xiàn)原理濒翻。
基于NSURL.采用block的方法處理請求,直接返回的是json啦膜、XML數(shù)據(jù)有送。AFN直接操作對象是AFHTTPClient,是一個實現(xiàn)了NSCoding和NSCopying協(xié)議的NSObject子類。AFGTTPClient是一個封裝了一系列操作方法的工具類僧家。AFN默認沒有封裝同步請求娶眷,如果開發(fā)者需要使用同步請求,需要重寫相關的方法(getPath:parameters:failure)啸臀,對AFHTTPRequestOperation進行同步處理届宠。

94烁落、什么是響應鏈,它是怎么工作的豌注?
http://www.reibang.com/p/9179e5d780c8

95伤塌、iOS 的沙盒目錄結構是怎樣的? App Bundle 里面都有什么轧铁?
1.沙盒結構

Application:存放程序源文件每聪,上架前經(jīng)過數(shù)字簽名,上架后不可修改
Documents:常用目錄齿风,iCloud備份目錄药薯,存放數(shù)據(jù),這里不能存緩存文件,否則上架不被通過
Library
Caches:存放體積大又不需要備份的數(shù)據(jù),SDWebImage緩存路徑就是這個
Preference:設置目錄,iCloud會備份設置信息
tmp:存放臨時文件救斑,不會被備份童本,而且這個文件下的數(shù)據(jù)有可能隨時被清除的可能

2.App Bundle 里面有什么

Info.plist:此文件包含了應用程序的配置信息.系統(tǒng)依賴此文件以獲取應用程序的相關信息
可執(zhí)行文件:此文件包含應用程序的入口和通過靜態(tài)連接到應用程序target的代碼
資源文件:圖片,聲音文件一類的
其他:可以嵌入定制的數(shù)據(jù)資源

iOS 的簽名機制大概是怎樣的?

假設脸候,我們有一個APP需要發(fā)布穷娱,為了防止中途篡改APP內容,保證APP的完整性运沦,以及APP是由指定的私鑰發(fā)的泵额。首先,先將APP內容通過摘要算法携添,得到摘要嫁盲,再用私鑰對摘要進行加密得到密文,將源文本烈掠、密文亡资、和私鑰對應的公鑰一并發(fā)布即可。那么如何驗證呢向叉?
驗證方首先查看公鑰是否是私鑰方的锥腻,然后用公鑰對密文進行解密得到摘要,將APP用同樣的摘要算法得到摘要母谎,兩個摘要進行比對瘦黑,如果相等那么一切正常。這個過程只要有一步出問題就視為無效奇唤。
iOS 7的多任務添加了哪兩個新的 API? 各自的使用場景是什么幸斥?

后臺獲取(Background Fetch):后臺獲取使用場景是用戶打開應用之前就使app有機會執(zhí)行代碼來獲取數(shù)據(jù)咬扇,刷新UI甲葬。這樣在用戶打開應用的時候,最新的內容將已然呈現(xiàn)在用戶眼前懈贺,而省去了所有的加載過程经窖。
推送喚醒(Remote Notifications):使用場景是使設備在接收到遠端推送后讓系統(tǒng)喚醒設備和我們的后臺應用坡垫,并先執(zhí)行一段代碼來準備數(shù)據(jù)和UI,然后再提示用戶有推送画侣。這時用戶如果解鎖設備進入應用后將不會再有任何加載過程冰悠,新的內容將直接得到呈現(xiàn)。

96配乱、UIScrollView 大概是如何實現(xiàn)的溉卓,它是如何捕捉、響應手勢的搬泥?

我對UIScrollView的理解是frame就是他的contentSize,bounds就是他的可視范圍,通過改變bounds從而達到讓用戶誤以為在滾動,以下是一個簡單的UIScrollView實現(xiàn)

在頭文件定義一個contentSize屬性

@interface MyScrollView : UIView
@property (nonatomic) CGSize contentSize;
@end

@implementationMyScrollView

  • (instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self == nil) {
    return nil;
    }

    添加一個滑動手勢
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGesture:)];
    [self addGestureRecognizer:pan];
    return self;
    }

  • (void)panGesture:(UIPanGestureRecognizer *)gestureRecognizer{

改變bounds
CGPoint translation = [gestureRecognizer translationInView:self];
CGRect bounds = self.bounds;

CGFloat newBoundsOriginX = bounds.origin.x - translation.x;
CGFloat minBoundsOriginX = 0.0;
CGFloat maxBoundsOriginX = self.contentSize.width - bounds.size.width;
bounds.origin.x = fmax(minBoundsOriginX, fmin(newBoundsOriginX, maxBoundsOriginX));

CGFloat newBoundsOriginY = bounds.origin.y - translation.y;
CGFloat minBoundsOriginY = 0.0;
CGFloat maxBoundsOriginY = self.contentSize.height - bounds.size.height;
bounds.origin.y = fmax(minBoundsOriginY, fmin(newBoundsOriginY, maxBoundsOriginY));

self.bounds = bounds;
[gestureRecognizer setTranslation:CGPointZero inView:self];

}

第二個問題個人理解是解決手勢沖突,對自己添加的手勢進行捕獲和響應

讓UIScrollView遵守UIGestureRecognizerDelegate協(xié)議,實現(xiàn)這個方法,在這里方法里對添加的手勢進行處理就可以解決沖突

  • (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

97桑寨、Objective-C 如何對已有的方法,添加自己的功能代碼以實現(xiàn)類似記錄日志這樣的功能忿檩?

這題目主要考察的是runtime如何交換方法

先在分類中添加一個方法,注意不能重寫系統(tǒng)方法,會覆蓋

  • (NSString *)myLog
    {
    這里寫打印行號,什么方法,哪個類調用等等
    }

然后交換方法

加載分類到內存的時候調用

  • (void)load
    {
    獲取imageWithName方法地址
    Method description = class_getClassMethod(self, @selector(description));

    獲取imageWithName方法地址
    Method myLog = class_getClassMethod(self, @selector(myLog));

    交換方法地址尉尾,相當于交換實現(xiàn)方式
    method_exchangeImplementations(description, myLog);
    }

98、+load 和 +initialize 的區(qū)別是什么休溶?

+(void)load;
當類對象被引入項目時, runtime 會向每一個類對象發(fā)送 load 消息
load 方法會在每一個類甚至分類被引入時僅調用一次,調用的順序:父類優(yōu)先于子類, 子類優(yōu)先于分類
load 方法不會被類自動繼承
+(void)initialize;
也是在第一次使用這個類的時候會調用這個方法

99、如何讓Category 支持屬性扰她?
使用runtime可以實現(xiàn)

頭文件

@interface NSObject (test)

@property (nonatomic, copy) NSString *name;

@end

.m文件

@implementation NSObject (test)
定義關聯(lián)的key
static const char *key = "name";

  • (NSString *)name
    {
    根據(jù)關聯(lián)的key兽掰,獲取關聯(lián)的值。
    return objc_getAssociatedObject(self, key);
    }
  • (void)setName:(NSString *)name
    {
    第一個參數(shù):給哪個對象添加關聯(lián)
    第二個參數(shù):關聯(lián)的key徒役,通過這個key獲取
    第三個參數(shù):關聯(lián)的value
    第四個參數(shù):關聯(lián)的策略
    objc_setAssociatedObject(self, key, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }

100孽尽、NSOperation 相比于 GCD 有哪些優(yōu)勢?
提供了在 GCD 中不那么容易復制的有用特性忧勿。
可以很方便的取消一個NSOperation的執(zhí)行
可以更容易的添加任務的依賴關系
提供了任務的狀態(tài):isExecuteing, isFinished.

101杉女、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,容易造成野指針錯誤

102鸳吸、如何為 Class 定義一個對外只讀對內可讀寫的屬性?
在頭文件中將屬性定義為readonly,在.m文件中將屬性重新定義為readwrite

103熏挎、Objective-C 中,meta-class 指的是什么晌砾?
meta-class 是 Class 對象的類,為這個Class類存儲類方法,當一個類發(fā)送消息時,就去那個類對應的meta-class中查找那個消息,每個Class都有不同的meta-class,所有的meta-class都使用基類的meta-class(假如類繼承NSObject,那么他所對應的meta-class也是NSObject)作為他們的類

104坎拐、UIView 和CALayer 之間的關系?
UIView顯示在屏幕上歸功于CALayer养匈,通過調用drawRect方法來渲染自身的內容哼勇,調節(jié)CALayer屬性可以調整UIView的外觀,UIView繼承自UIResponder呕乎,CALayer不可以響應用戶事件
UIView是iOS系統(tǒng)中界面元素的基礎积担,所有的界面元素都繼承自它。它內部是由Core Animation來實現(xiàn)的猬仁,它真正的繪圖部分帝璧,是由一個叫CALayer(Core Animation Layer)的類來管理先誉。UIView本身,更像是一個CALayer的管理器聋溜,訪問它的根繪圖和坐標有關的屬性谆膳,如frame,bounds等撮躁,實際上內部都是訪問它所在CALayer的相關屬性
UIView有個layer屬性漱病,可以返回它的主CALayer實例,UIView有一個layerClass方法把曼,返回主layer所使用的類杨帽,UIView的子類,可以通過重載這個方法嗤军,來讓UIView使用不同的CALayer來顯示

105注盈、+[UIView animateWithDuration:animations:completion:] 內部大概是如何實現(xiàn)的?
animateWithDuration:這就等于創(chuàng)建一個定時器
animations:這是創(chuàng)建定時器需要實現(xiàn)的SEL
completion:是定時器結束以后的一個回調block

以上只是自己的理解,不一定正確,有對這個有研究的朋友請告知下

106叙赚、什么時候會發(fā)生「隱式動畫」老客?
當改變CALayer的一個可做動畫的屬性,它并不能立刻在屏幕上體現(xiàn)出來.相反震叮,它是從先前的值平滑過渡到新的值胧砰。這一切都是默認的行為,你不需要做額外的操作,這就是隱式動畫

107苇瓣、如何處理異步的網(wǎng)絡請求尉间?
異步請求:會單獨開一個線程去處理網(wǎng)絡請求,主線程依然處于可交互狀態(tài),程序運行流暢
POST請求
NSString *urlString = @"www.baidu.com";
創(chuàng)建url對象
NSURL *url = [NSURL URLWithString:urlString];
創(chuàng)建請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
創(chuàng)建參數(shù)字符串對象
NSString *parmStr = [NSString stringWithFormat:@"參數(shù)"];
將字符串轉換為NSData對象
NSData *data = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
[request setHTTPMethod:@"POST"];
創(chuàng)建異步連接
[NSURLConnection connectionWithRequest:request delegate:self];

然后實現(xiàn)代理方法

服務器接收到請求時

  • (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {
    }
    當收到服務器返回的數(shù)據(jù)時觸發(fā), 返回的可能是資源片段
  • (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {
    }
    當服務器返回所有數(shù)據(jù)時觸發(fā), 數(shù)據(jù)返回完畢
  • (void)connectionDidFinishLoading:(NSURLConnection *)connection
    {
    }
    請求數(shù)據(jù)失敗時觸發(fā)
  • (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    {
    NSLog(@"%s", FUNCTION);
    }

108击罪、frame 和bounds 的區(qū)別是什么哲嘲?
frame相對于父視圖,是父視圖坐標系下的位置和大小。bounds相對于自身,是自身坐標系下的位置和大小媳禁。
frame以父控件的左上角為坐標原點眠副,bounds以自身的左上角為坐標原點

109、如何把一張大圖縮小為1/4大小的縮略圖竣稽?
let data = UIImageJPEGRepresentation(image, 0.25)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末侦啸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子丧枪,更是在濱河造成了極大的恐慌光涂,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拧烦,死亡現(xiàn)場離奇詭異忘闻,居然都是意外死亡,警方通過查閱死者的電腦和手機恋博,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門齐佳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來私恬,“玉大人,你說我怎么就攤上這事炼吴”久” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵硅蹦,是天一觀的道長荣德。 經(jīng)常有香客問我,道長童芹,這世上最難降的妖魔是什么涮瞻? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮假褪,結果婚禮上署咽,老公的妹妹穿的比我還像新娘。我一直安慰自己生音,他們只是感情好宁否,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缀遍,像睡著了一般慕匠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瑟由,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天絮重,我揣著相機與錄音冤寿,去河邊找鬼歹苦。 笑死,一個胖子當著我的面吹牛督怜,可吹牛的內容都是我干的殴瘦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼号杠,長吁一口氣:“原來是場噩夢啊……” “哼蚪腋!你這毒婦竟也來了?” 一聲冷哼從身側響起姨蟋,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤屉凯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后眼溶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悠砚,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年堂飞,在試婚紗的時候發(fā)現(xiàn)自己被綠了灌旧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绑咱。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖枢泰,靈堂內的尸體忽然破棺而出描融,到底是詐尸還是另有隱情,我是刑警寧澤衡蚂,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布窿克,位于F島的核電站,受9級特大地震影響讳窟,放射性物質發(fā)生泄漏让歼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一丽啡、第九天 我趴在偏房一處隱蔽的房頂上張望谋右。 院中可真熱鬧,春花似錦补箍、人聲如沸改执。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辈挂。三九已至,卻和暖如春裹粤,著一層夾襖步出監(jiān)牢的瞬間终蒂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工遥诉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拇泣,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓矮锈,卻偏偏與公主長得像霉翔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子苞笨,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容

  • 從三月份找實習到現(xiàn)在债朵,面了一些公司,掛了不少瀑凝,但最終還是拿到小米序芦、百度、阿里粤咪、京東谚中、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,184評論 11 349
  • 父類實現(xiàn)深拷貝時藏杖,子類如何實現(xiàn)深度拷貝将塑。父類沒有實現(xiàn)深拷貝時,子類如何實現(xiàn)深度拷貝蝌麸。? 深拷貝同淺拷貝的區(qū)別:淺拷...
    JonesCxy閱讀 991評論 1 7
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,124評論 29 470
  • 1. Java基礎部分 基礎部分的順序:基本語法点寥,類相關的語法,內部類的語法来吩,繼承相關的語法敢辩,異常的語法,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 0.命名法 駝峰式命名法(CamelCase)分大駝峰式命名法(UpperCamelCase)和小駝峰式命名法(l...
    KaelQ閱讀 1,325評論 3 27