常見面試題彙總

父類實現深拷貝時,子類如何實現深度拷貝。父類沒有實現深拷貝時,子類如何實現深度拷貝。ios

• 深拷貝同淺拷貝的區別:淺拷貝是指針拷貝,對一個對象進行淺拷貝,至關於對指向對象的指針進行復制,產生一個新的指向這個對象的指針,那麼就是有兩個指針指向同一個對象,這個對象銷燬後兩個指針都應該置空。深拷貝是對一個對象進行拷貝,至關於對對象進行復制,產生一個新的對象,那麼就有兩個指針分別 指向兩個對象。當一個對象改變或者被銷燬後拷貝出來的新的對象不受影響。程序員

• 實現深拷貝須要實現NSCoying協議,實現- (id)copyWithZone:(NSZone *)zone 方法。當對一個property屬性含有copy修飾符的時候,在進行賦值操做的時候實際上就是調用這個方法。算法

• 父類實現深拷貝以後,子類只要重寫copyWithZone方法,在方法內部調用父類的copyWithZone方法,以後實現本身的屬性的處理sql

• 父類沒有實現深拷貝,子類除了須要對本身的屬性進行處理,還要對父類的屬性進行處理。數據庫

KVO,NSNotification,delegate及block區別編程

• KVO就是cocoa框架實現的觀察者模式,通常同KVC搭配使用,經過KVO能夠監測一個值的變化,好比View的高度變化。是一對多的關係,一個值的變化會通知全部的觀察者。json

• NSNotification是通知,也是一對多的使用場景。在某些狀況下,KVO和NSNotification是同樣的,都是狀態變化以後告知對方。NSNotification的特色,就是須要被觀察者先主動發出通知,而後觀察者註冊監聽後再來進行響應,比KVO多了發送通知的一步,可是其優 點是監聽不侷限於屬性的變化,還能夠對多種多樣的狀態變化進行監聽,監聽範圍廣,使用也更靈活。swift

• delegate 是代理,就是我不想作的事情交給別人作。好比狗須要吃飯,就經過delegate通知主人,主人就會給他作飯、盛飯、倒水,這些操做,這些狗都不須要關 心,只須要調用delegate(代理人)就能夠了,由其餘類完成所須要的操做。因此delegate是一對一關係。設計模式

• block是delegate的另外一種形式,是函數式編程的一種形式。使用場景跟delegate同樣,相比delegate更靈活,並且代理的實現更直觀。數組

• KVO通常的使用場景是數據,需求是數據變化,好比股票價格變化,咱們通常使用KVO(觀察者模式)。delegate通常的使用場景是行爲,需求是須要別人幫我作一件事情,好比買賣股票,咱們通常使用delegate。

Notification 通常是進行全局通知,好比利好消息一出,通知你們去買入。delegate是強關聯,就是委託和代理雙方互相知道,你委託別人買股票你就須要知道經紀人, 經紀人也不要知道本身的顧客。Notification是弱關聯,利好消息發出,你不須要知道是誰發的也能夠作出相應的反應,同理發消息的人也不須要知道 接收的人也能夠正常發出消息。

將一個函數在主線程執行的4種方法

• GCD方法,經過向主線程隊列發送一個block塊,使block裏的方法能夠在主線程中執行。

dispatch_async(dispatch_get_main_queue(), ^{

須要執行的方法

});

• NSOperation 方法

NSOperationQueue 

mainQueue = [NSOperationQueue mainQueue]; 主隊列

operation = [NSBlockOperation blockOperationWithBlock:^{ 

須要執行的方法

}];

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

如何讓計時器調用一個類方法

• 計時器只能調用實例方法,可是能夠在這個實例方法裏面調用靜態方法。

• 使用計時器須要注意,計時器必定要加入RunLoop中,而且選好model才能運行。scheduledTimerWithTimeInterval方法建立一個計時器並加入到RunLoop中因此能夠直接使用。

• 若是計時器的repeats選擇YES說明這個計時器會重複執行,必定要在合適的時機調用計時器的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;

}

如何重寫類方法

• 一、在子類中實現一個同基類名字同樣的靜態方法

• 二、在調用的時候不要使用類名調用,而是使用[self class]的方式調用。原理,用類名調用是早綁定,在編譯期綁定,用[self class]是晚綁定,在運行時決定調用哪一個方法。

NSTimer建立後,會在哪一個線程運行。

• 用scheduledTimerWithTimeInterval建立的,在哪一個線程建立就會被加入哪一個線程的RunLoop中就運行在哪一個線程

• 本身建立的Timer,加入到哪一個線程的RunLoop中就運行在哪一個線程。

id和NSObject*的區別

• id是一個 objc_object 結構體指針,定義是typedef struct objc_object 

id

• id能夠理解爲指向對象的指針。全部oc的對象 id均可以指向,編譯器不會作類型檢查,id調用任何存在的方法都不會在編譯階段報錯,固然若是這個id指向的對象沒有這個方法,該崩潰仍是會崩潰的。

指向的必須是NSObject的子類,調用的也只能是NSObjec裏面的方法不然就要作強制類型轉換。 

• 不是全部的OC對象都是NSObject的子類,還有一些繼承自NSProxy。NSObject *可指向的類型是id的子集。

如下內容後續補充

iOS 核心框架

• CoreAnimation

• CoreGraphics

• CoreLocation

• AVFoundation

• Foundation

iOS核心機制

• UITableView 重用

• ObjC內存管理;自動釋放池,ARC如何實現

• runloop

• runtime

• Block的定義、特性、內存區域、如何實現

• Responder Chain

• NSOperation

• GCD

數據結構

• 8大排序算法

• 二叉樹實現

• 二分查找實現

面向對象編程

• 封裝、繼承、多態

• 設計模式6個原則

• 設計一個類的功能,如何劃分粒度(單一職責)

• 接口隔離。

• 若是有一個鳥類,有飛的動做,一個鴕鳥繼承它是合適的嗎(里氏替換)

• 類之間的依賴如何依賴偶合度最小(依賴倒轉)

高層依賴低層,低層不能依賴高層。依賴接口,不能依賴具體的類。

• 若是A要調用C函數,但C是B的成員類,應該如何設計?(迪米特法則)

• 如何設計類,能作到只增長代碼,而不修改代碼,有哪些經驗(開放封閉)

經過設計模式解決。

計算機技術

• 計算機網絡: TCP/IP、HTTPCDN、SPDY

• 計算機安全: RSA、AES、DES

• 操做系統:線程、進程、堆棧、死鎖、調度算法

iOS新特性、新技術

• iOS7 UIDynamic、SpritKit、新佈局、扁平化

• iOS8 應用程序擴展、HealthKit、SceneKit、CoreLocation、TouchID、PhotoKit

• iOS9

• Apple Watch

• 第三方庫:SDWebImage、AFNetwork、JSONKit、wax

** 筆記  **

簡述OC中內存管理機制.

答:內存管理機制:使用引用計數管理,分爲ARC和MRC,MRC須要程序員本身管理內存,ARC則不須要.可是並非全部對象在ARC環境下均不須要管理內存,子線程和循環引用並非這樣.與retain配對使用的是release,retain表明引用計數+1,release表明引用計數-1,當引用計數減爲0時,對象則被系統自動銷燬.與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修飾基本數據類型,weak修飾對象類型.strong和weak用於ARC下(ARC下的代理使用weak,block塊使用copy).strong至關於retain.weak至關於assign;assign/retain/copy這些屬性用於指定set訪問器的語義,也就是說,這些屬性決定了以何種方式對數據成員賦值.

assign,直接賦值,引用計數不改變,適用於基本數據類型.

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

copy:對象的拷貝,新申請一塊內存空間,並把原始內容複製到那片空間.新對象的引用計數爲1,此屬性只對那些遵循了NSCopy協議的對象類型有效.

③.nonatomic,非原子性訪問,不加同步,是異步操做.默認爲atomic,原子操做,atomic是Objc使用的一種線程保護技術,基本上來說,是防止在寫未完成的時候被另一個線程讀取,形成數據錯誤,而這種機制是消耗系統內存資源的,因此在移動端,都選擇nonatomic.

3.內存分爲5個區,分別是棧區,堆區,全局區,文字常量區,程序代碼區.

棧區:由編譯器自動分配釋放,不須要管理內存.

堆區:通常有程序員分配釋放.

全局區:存放全局變量和靜態變量.

常量區:存放常量字符串.

代碼區:存放二進制代碼.

3.類變量的@protected,@private,@public,@package,聲明各有什麼含義?

@protected 受保護的.本類,子類可見.

@private 私有的,類內可用

@public 公有的,類內,子類,外部都可用

@package 可見度在@protected和@public之間,這個類型最經常使用於框架類的實例變量.

4.線程是什麼?進程又是什麼?區別和聯繫.

進程:正在運行的程序,負責程序的內存分配.

線程:線程是進程中一個獨立執行的控制單元(路徑),一個進程至少包含一條線程,即主線程.

建立線程的目的:開闢一條新的執行路徑,運行指定的代碼,與主線程的代碼實現同時執行.

5.對多線程開發的理解,iOS中有幾種實現多線程的方式.

多線程的使用場景:防止卡頓,能夠同時完成多個任務,且不影響主線程,把耗時操做放在子線程中執行,可是會消耗內存.

實現多線程的方式:

①.NSThread(內存須要本身管理.觸發),

②.NSOperationQueue(再也不關注線程,當前可執行任務個數queue.maxConcurrentOperationCount)

③.GCD

詳解三種實現多線程的方式:

GCD:

GCD裏面包含了串行隊列、並行隊列、主隊列、全局隊列。

Dispatch_queue_t q = dispatch_queue_create(「qqq」,DISPATCH_QUEUE_SERIAL);建立一個串行隊列

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建立線程的兩種方式:

  • (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;

  • (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;

暫停當前線程:

[NSThread sleepForTimeInterval:2];

NSOperationQueue

建立一個操做隊列:NSOperationQueue * queue = [[NSOperationQueue alloc]init];

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

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

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

}];

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

設置隊列的最大操做數:[queue setMaxConcurrentOperationCount:1];

等待options完成:[operation waitUntilFinished];

暫停、繼續queue:[queue setSuspended:YES] [queue setSuspend:NO]

6.線程同步和異步的區別?ios中如何實現線程的同步?

同步:任務順序執行,下一個任務依賴於上一任務的完成.

異步:任務執行順序不定,一塊兒執行.

實現:設置依賴:NSOpreationQueue GCD中的串行隊列.

7.iOS類是否能夠多繼承,若是沒有,怎麼實現?

不能夠多繼承.能夠經過類目,延展,協議實現多繼承.

類目:類目也叫分類,英文category,在沒有原類.m文件的基礎上,給該類添加方法.類目裏不能添加實例變量,不能添加和原始類方法名相同的方法,不然會發生覆蓋.一個類能夠添加多個類目,類目中的方法能夠成爲原始類的一部分,和原始類方法級別相同,能夠被子類繼承.

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

雖然延展是給一個類定義私有方法,可是OC沒有絕對的私有方法,其實仍是能夠調用的,延展裏面聲明的變量只能在該類內部使用,外界訪問不了.若是是新建文件建的的某類延展.h文件,則不能添加實例變量,若是括號裏沒有類目名,則認爲延展裏面的方法爲全都必須實現,若是有,則可選實現.

類目寫的方法必須實現,延展寫的方法非必須.

8.棧和堆的區別?

棧:內存系統管理(系統開闢,系統釋放),先進後出.

堆:內存本身管理(本身開闢,本身釋放).先進先出.

9.iOS本地數據存儲都有幾種方式?

①.NSkeyedArchiver:採用歸檔的形式來保存數據,該數據對象須要遵照NSCoding協議,而且該對象對應的類必須提供encodeWithCoder:和initWithCoder:方法.前一個方法告訴系統怎麼對對象進行編碼,然後一個方法則是告訴系統怎麼對對象進行解碼.

②.NSUserDefaults:用來保存應用程序設置和屬性,用戶保存的數據.用戶再次打開程序或者開機後這些數據仍然存在.NSUserDefaults能夠存儲的數據類型包括:NSData,NSString,NSNumber,NSDate,NSArray.NSDictionary,其餘類型的數據須要先行轉換.

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

④.SQLite:採用SQLite數據庫來存儲數據,SQLite做爲一種輕量級數據庫.具體:a.添加SQLite相關的庫以及頭文件,b.使用數據庫存數數據:打開數據庫,編寫數據庫語句,執行,關閉數據庫.另:寫入數據庫,字符串能夠採用char方式,而從數據庫中取出char類型,當char類型有表示中文字符時,會出現亂碼,這是由於數據庫默認使用ascII編碼方式,因此想要正確從數據庫中取出中文,須要使用NSString來接受從數據庫取出的字符串.

⑤.CoreData:原理是對SQLite的封裝,開發者不須要接觸sql語句,就能夠對數據庫進行操做.

10.ios動態類型和動態綁定

多態:父類指針指向子類對象.

動態類型:只有在運行期,才能肯定其真正類型.

動態加載:根據不一樣的條件,加載不一樣的資源.32和64位.

11.深拷貝和淺拷貝的理解.

深拷貝;拷貝的內容.

淺拷貝:拷貝的指針.

深拷貝如:

NSMutableDictionary 

dic = [@{} mutableCopy];

NSMutableArray

ary = [@[] mutableCopy]; 

12.怎麼實現一個單例的類.

單例是一種設計模式,對象只有一個.缺點:對象不會被釋放,若是建立不少的話會佔用不少內存,優勢:能夠當作工具類使用.

static SortDetailsModelDown * single = nil;

+(SortDetailsModelDown *)shareSortDetailsModelDown{

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

}

13.什麼是安全釋放?

先釋放再置空.

14.RunLoop是什麼?

事件循環,是線程裏面的一個組件.主線程的RunLoop是自動開啓的.分爲:計時源(timer source),事件源(輸入源):input source.防止CPU中斷(保證程序執行的線程不會被系統終止).

Runloop提供了一種異步執行代碼的機制,並不能並行執行任務,是事件接收和分發機制的一個實現.每個線程都有其對應的RunLoop,可是默認非主線程的RunLoop是沒有運行的,須要爲RunLoop添加至少一個事件源,而後run它.

通常狀況下咱們是沒有必要去啓動線程的RunLoop的,除非你在一個單獨的線程中須要長時間的檢測某個事件.

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

input source傳遞異步事件,一般是來自其餘線程和不一樣程序的消息.

timer source傳遞同步事件.

當有事件發生時,RunLoop會根據具體的事件類型通知應用程序做出響應.

當沒有事件發生時,RunLoop會進入休眠狀態,從而到達省電的目的.

當事件再次發生時,RunLoop會被從新喚醒,處理事件.

通常在開發中不多會主動建立RunLoop,而一般會把事件添加到RunLoop中.

15.什麼是序列化和反序列化,能夠用來作什麼?如何在OC中實現複雜對象的存儲.

序列化和反序列化:歸檔和反歸檔,進行本地化,進行數據存儲.

CoreData:數據託管.有四種存儲方式:xml,sqlite,二進制,內存.

遵循NSCoding協議以後,進行歸檔便可實現複雜對象的存儲.

16.寫一個標準宏MIN,這個宏輸入兩個參數並返回較小的一個.

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

17.iPhone OS 有沒有垃圾回收機制,簡易闡述一下OC內存管理.

木有.引用計數,ARC和MRC,swift(自動引用計數).

18.簡述應用程序按HOME鍵進入後臺時的生命週期,以及從後臺進入前臺時的生命週期.

前者:- (void)applicationWillResignActive:(UIApplication *)application

  • (void)applicationDidEnterBackground:(UIApplication *)application

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

  • (void)applicationDidBecomeActive:(UIApplication *)application

另:

各個程序運行狀態時代理的回調:

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

告訴代理進程啓動但還沒進入狀態保存

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

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

  • (void)applicationWillResignActive:(UIApplication *)application

當應用程序將要入非活動狀態執行,在此期間,應用程序不接收消息或事件,好比來電話了

  • (void)applicationDidBecomeActive:(UIApplication *)application

當應用程序入活動狀態執行,這個恰好跟上面那個方法相反

  • (void)applicationDidEnterBackground:(UIApplication *)application

當程序被推送到後臺的時候調用。因此要設置後臺繼續運行,則在這個函數裏面設置便可

  • (void)applicationWillEnterForeground:(UIApplication *)application

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

  • (void)applicationWillTerminate:(UIApplication *)application

當程序將要退出是被調用,一般是用來保存數據和一些退出前的清理工做。這個須要要設置UIApplicationExitsOnSuspend的鍵值。

  • (void)applicationDidFinishLaunching:(UIApplication*)application

當程序載入後執行

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

如今啓動程序看看執行的順序:

啓動程序

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的時候這幾個函數裏面應該作什麼工做?

alloc:申請內存時調用.

loadView:加載視圖時調用.

viewDidLoad;視圖已經加載後調用.

viewWillAppear:視圖將要出現時調用.

viewDidUnload:視圖已經加載可是沒有加載出來時調用.

dealloc:銷燬該視圖時調用.

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

20.描述應用程序的啓動順序.

a.程序入口main函數建立UIApplication實例和UIApplication代理實例.

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

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

21.爲何不少內置類如UITableViewControl的delegate屬性都是assign而不是retain?

防止循環引用.

如:對象A引用了對象B,對象B引用了對象C,對象C引用了對象B,這個時候B的引用計數是2,而C的引用計數是1,當A再也不使用B的時候,就釋放了B的全部權,這個時候C還引用對象B,因此B不會釋放,引用計數爲1,由於B也引用着對象C,B不釋放,那麼C也就不會被釋放,因此他們的引用計數都爲1,而且永遠不會被釋放,造成了循環引用.

22.使用UITableView的時候必需要實現的幾種方法?

2個數據源方法.分別是:

  • (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:系統會先檢查系統緩存中是否有該名字的image,若是有的話,則直接返回,若是沒有,則先加載圖像到緩存,而後再返回.

initWithContentsOfFile:系統不會檢查緩存,而直接從文件系統中記載並返回.

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

死循環

  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"中,"|"字符前面和後面的數據,分別輸出它們。

["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,是建立窗口中的一個視圖,能夠響應交互事件.一個程序只有一個主window,能夠有多個window.

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

31.寫一個完整的代理,包括聲明,實現.

代理:遵照協議的對象.

@class MyView;

第一步:指定協議:(協議名:類名+Delegate)

@protocol MyViewDelegate <NSObject>

@required

-(void)changeViewBackgroudColor:(MyView *)view;

@optional

-(void)test;

@end

@interface MyView : UIView

第二步:指定代理

@property (nonatomic,assign)id<MyView> delegate;

@end

第三步:代理遵循協議.

第四步:代理實現協議裏面的必須實現的方法和其餘可選方法.

第五步:委託方通知代理開始執行方法.

32.分析json.xml的區別,底層如何實現?

Json:鍵值對.數據小,不復雜.便於解析,有框架支持,適合輕量級傳輸.做爲數據包個數傳輸的時候效率更高.

xml:標籤套內容.xml數據兩較大,比較複雜.適合大數據量的傳輸.xml有豐富的編碼工具,好比:Dom4j,JDom.解析方式有兩種,一是經過文芳模型解析,另一種遍歷節點.

33.ViewController的didReceiveMemoryWarning是在何時被調用的?

1.當應用程序的內存使用接近系統的最大內存使用時,應用會向系統發送內存警告,這時候系統會調用方法向全部ViewController發送內存警告.

2.打開系統相機.

3.加載高清圖片.

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

34.面向對象的三大特徵,簡單介紹.

封裝:代碼模塊化,方便之後調用.

繼承:子類繼承父類的全部方法和屬性.

多態:父類指針指向子類對象.

35.重寫一個NSString類型的,retain方式聲明name屬性的setter和getter方法.

屬性的三大特性:語義特性,原子特性,讀寫特性.

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

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

    if(_name != name){

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

    }

}

  • (NSString *)name{

    return [[_name retain]autorelease];

}

36.簡述NotificationCenter.KVC,KVO,Delegate?並說明它們之間的區別?

NotificationCenter:消息中心.消息通知.

KVC:利用鍵-值間接訪問類中的某個屬性.

[self setValue:@"123" forKeyPath:@"name"];

NSLog(@"%@",[self valueForKeyPath:@"name"]);

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

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

37.What is lazy loading?

懶加載

38.對MVC的理解,好處?

MVC:是一種架構.model:數據處理,view:視圖顯示,controller:邏輯控制,負責視圖和模型之間的通訊.

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

39.監測鍵盤的彈出.

通知.

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

  1. 5個ios,sdk庫和第三方庫.

    系統庫:UIKit框架:負責應用程序的圖形及事件驅動的關鍵基礎,如:用戶界面管理,圖形和窗口支持.

Mapkit框架:地圖.

Message UI框架:電子郵件

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

OpenAL框架:用於播放,可播放高質,高性能的網絡音頻

Core Data框架:將數據存儲在SQLite數據庫.

Core Media框架:播放視頻.

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

ShareSDK 分享

SVProgressHUD 輕量級菊花

AFNetworkin 方便網絡開發

FreeStreamer 播放音頻

41.介紹響應者鏈.

當用戶點擊屏幕,可以產生響應的對象組成的鏈.

繼承自NSResponder,響應者鏈可以中斷.

42.傳值方式:

通知,單例,代理,屬性,block.

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

編譯時是NSString,運行時是NSData.NSData

44.OC中對象的交互是如何實現的?

消息機制.

45.給定一個字符串,判斷字符串中是否還有png,有就刪除.

stringContains,使用@""直接替換實現刪除

46.目標-動做機制.

Target - action

47.什麼是沙盒?沙盒裏包含哪些文件,如何獲取文件路徑.

沙盒:程序可操做的磁盤空間,系統爲之開闢.

包含了3個文件夾.

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

2.Library :是一個資源庫,存儲一些不過重要的數據.裏面包含了兩個子文件夾,Caches文件夾,用於緩存,

Preferences文件夾,系統偏好設置,用戶對應用程序的設置,如密碼.perferences路徑沒法找到,只能經過NSUserDefaults.

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

48.介紹一下XMPP?

基於XML的點對點通信協議,實現通信功能.

優勢:能夠跨平臺開發.

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

49.應用程序如何省電?

獲取請求不能過頻.優化算法.

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 的區別?多線程下那個更安全.

NSArray: 不可變數組.

NSMutableArray: 可變數組.

多線程下NSArray更安全.

52.取出一個數組中的重複元素.

1.放進集

2.遍歷刪除

3.放進字典做爲key,再取出key

54.isKindOfClass,isMemberOfClass做用分別是什麼?

isKindOfClass是某個類的實例或者子類的實例.

isMemberOfClass是某個類的實例

55.請分別寫出SEL,id的意思?

SEL:選擇器.

id:範類型

OC中的對象就是C語言的指針.

56.iPhone上,能被應用程序直接調用的系統程序是什麼?

能:相冊,相機,通信錄,音樂.

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

57.以.mm爲擴展名的文件裏,能夠包含哪些代碼?

C++,C,OC

58.說說後臺如何運行程序.

在plist配置Application does not run in background設置NO(默認就是NO)的前提下.

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

59.sizeof和strlen的區別和聯繫?

sizeof:佔用空間大小.

strlen:字符串大小.

60.sprintf,strcpy,memcpy的功能?使用上要注意哪些地方?

sprintf:將某些類型轉換成字符串類型

strcpy:拷貝字符串,會越界,'/0'

memcpy:拷貝內存

61.寫一個函數實現strlen的功能?

int sl(const char *s)

{

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

}

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

NSString * str = @"20130322152832";

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

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

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

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

a、一個整型數int a = 10

b、一個指向整型數的指針int *p = 10

c、一個指向指針的指針,它指向的指針是指向一個整型數int **p =10

d、一個有10個整型數的數組 int a[10]

e、一個有10個指針的數組,該指針是指向一個整型數的int *a[10]

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

g、一個指向函數的指針,該函數有一個整型參數,並返回一個整型數

int *a(int b){

return b;

}

64.cocoa和 cocoa touch?

cocoa包含Foundation和AppKit框架,可用於開發Mac OS X系統的應用程序

cocoa touch包含Foundation和UIKit框架,可用於開發iPhone OS 系統的應用程序

Cocoa時Mac OS X的開發環境,cocoa Touch是 Iphone OS的開發環境

65.網絡從下往上分爲幾層?

從下往上:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層。

IP 協議對應網絡層,TCP 協議對應傳輸層,HTTP 協議對應於應用層。

socket 則是對 TCP/IP協議的封裝和應用。也能夠說,TCP/IP協議是傳輸層協議,主要解決數據如何在網絡中傳輸,而 HTTTP 是應用層協議,主要解決

66.熱更新幾種實現方式

http://www.jianshu.com/p/8cec322531ae

67.多線程的底層實現?

線程:進程中一個特立獨行的控制單元(路徑)。多線程:一個進程至少有一個線程,即主線程。

①、Mach 是第一個以多線程方式處理任務的系統,所以多線程的底層實現機制就是基於 Mach 的線程。

②、開發中不多用到 Mach 級的線程,由於 Mach級的線程沒有提供多線程的基本特徵,線程之間是獨立的。

④、開發中實現多線程的方案:

NSThread、GCD、NSOperationQueue.NSOperation

68.線程之間怎麼通訊?

①.performSelect:onThread:withObject:waitUntilDone:

②.NSMachPort

69.網絡圖片問題中怎麼解決一個相同的網絡地址重複請求的問題.

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

70.用 NSOperation和 NSOperationQueue處理 A.B.C三個線程,要求執行完 A.B 後才能執行?

建立隊列

NSOperationQueue * queue = [[NSOperationQueue alloc]init];

建立三個操做

NSOperation * A = [NSBlockOperation blockOperationWithBlock:^{

NSLog{@"A"};

}];

NSOperation * B = [NSBlockOperation blockOperationWithBlock:^{

NSLog{@"B"};

}];

NSOperation * C = [NSBlockOperation blockOperationWithBlock:^{

NSLog{@"C"};

}];

添加依賴

[C addDependency:a];

[C addDependency:b];

執行操做

[queue addOperation:a];

[queue addOperation:b];

[queue addOperation:c];

71.GCD內部怎麼實現的?

①.iOS和 OSX 的核心是 XNU 內核, GCD是基於 XNU 內核實現的(是由蘋果電腦發展起來的操做系統內核).

②.GCD 的 API 所有在 libdispatch 庫中.

③.GCD 底層實現主要有 Dispatch Queue(管理 block)和 Dispatch Source(處理事件).

72.怎麼保證多人開發進行內存泄露檢查。

使用Analuze進行代碼的靜態分析,爲避免麻煩,多人開發儘可能使用ARC.

7三、非自動內存管理狀況下怎麼作單例模式。

建立一個單例對象的靜態實例,並初始化爲nil。

建立一個類的類工廠方法,當且僅當這個類的實例爲nil時生成一個類的實例。

實現NScopying協議,覆蓋allocWithZone:方法,確保用戶在直接分配對象時,不會產生另外一個對象。

覆蓋release、autorelease、retain、retainCount方法,確保單例的狀態。

7四、對於類方法(靜態方法)默認是autorelease的,全部類方法都會這樣嗎?

①、系統自帶的絕大數類方法返回的對象,都是通過autorelease.

7五、block在ARC中和MRC中的方法有何區別?須要注意什麼?

①.對於沒有引用外部變量的Block,不管在ARC仍是MRC下,類型都是  NSGlobalBlock ,這種類型的block能夠理解爲一種全局的block,不須要考慮做用域的問題。同時,對它進行Copy和Retain操做也是無效的。 

②.避免循環引用。

根據isa指針,block一共有3種類型的block

_NSConcreteGlobalBlock 全局靜態

_NSConcreteStackBlock 保存在棧中,出函數做用域就銷燬

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

76.什麼狀況下會發生內存泄露和內存溢出?

當程序在申請內存後,沒法釋放已經申請的內存空間(例如一個對象或者變量在用完後沒有釋放,這個對象就一直佔用着內存),一次內存泄露能夠忽略,但若是泄露過多的話,就會形成內存溢出。

當程序在申請內存時,但存入了更大的數據,出現內存溢出。

77.[NSArray arrayWithobject<id>]這個方法添加對象後,須要對這個數組進行釋放操做嗎?

不須要,這個對象會被放到自動釋放池中。

78.自動釋放池如何實現?

自動釋放池以棧的形式實現,當你建立一個新的自動釋放池時,它將被添加到棧頂,當一個對象收到發送autorelease消息時,它將添加到當前線程的處於棧頂的自動釋放池中,當自動釋放池被回收時,它們從棧中被刪除而且會給池子裏全部對象都作一次release操做。

79.KVO內部實現原理?

①.KVO是基於runtime機制實現的。

②.當某個類的對象第一次被觀察時,系統就會在運行期動態的建立該類的一個派生類,在這個派生類中重寫基類中任何被觀察屬性的setter方法。

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

80.可否把比較耗時的操做放在NSNotificationCenter中。

若是在異步線程發出的通知,那麼就能夠把耗時操做放到NSNotificationCenter中

若是在主線程發的通知,那麼就不能夠把耗時操做放到NSNotificationCenter中。

81.Foundation對象與Core Foundation對象有何區別?

Foundation對象是OC的,Core Foundation對象是C對象。

數據類型之間的轉換:

ARC:_bridge_retained、_bridge_transfer

非ARC:_bridge

8二、不用第三變量,交換AB的值。

A=A+B

B=A-B

A=A-B

或者

A=A^B

B=A^B

A=A^B

83.簡單描述下對單例模式設計的理解?

節省內存資源,一個應用就一個對象。

84.runtime實現的機制是什麼?怎麼用,通常用於幹嗎。

運行時機制,runtime庫裏面包含了跟類、成員變量、方法相關的API,好比獲取類裏面的全部成員變量,爲類動態添加成員變量、動態改變類的方法實現,爲類動態添加新的方法等,須要導入<objc/message.h><objc/message.h>

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

②.實際上咱們編寫的全部OC代碼,最終都是轉換成爲了runtime庫的東西,好比類轉換成了runtime庫裏面的結構體等數據類型,方法轉換成了runtime庫裏面的C語言函數,平時調方法都是轉成了objc_msgSend函數(因此說OC有個消息發送機制)

③、所以,能夠說runtime是OC的底層實現,是OC的幕後執行者。

④、有了runtime庫,能作什麼呢?能夠獲取類裏面的全部成員變量、爲類動態的添加成員變量、動態的改變類的方法實現、爲類動態添加新的方法等等。

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

Core Text

隨意修改文本的樣式

圖文混排(純C語言)

Core Image(濾鏡處理)

可以調節圖片的各類屬性(對比度、色溫、色差等)

8六、NSNotification和KVO的區別和用法是什麼?何時應該使用通知,何時應該使用KVO,他們的實現有何區別?若是用protocol和delegate來實現相似的功能可能嗎?可能的話有何問題?不可能的話why?

通知比較靈活,一個通知能被多個對象接受,一個對象能夠接受多個通知。

代理不交規範,可是代碼較多(默認是一對一)

KVO性能很差(底層會產生新的類),只能監聽某個對象屬性的變化,不推薦使用。

8七、block內部的實現原理。

Objective-C是對C語言的擴展,block的實現是基於指針和函數指針。

8八、怎麼解決緩存池滿的問題?

iOS中不存在緩存池滿的狀況,一般在對象須要建立時才建立,好比UITableView中通常只會建立剛開始在屏幕中的cell,以後都是從緩存池裏取,不會再建立新對象。

8九、控制器View的生命週期及相關函數是什麼?你在開發中是如何使用的?

一、首先判斷控制器是否有視圖,若是沒有就調用loadView方法建立:經過storyBoard或者代碼。

二、隨後調用viewDidLoad,能夠進行下一步的初始化操做,只會被調用一次。

三、在視圖顯示以前調用viewWillAppear,該函數能夠屢次調用。

四、視圖viewDidAppear

五、在佈局變化先後,調用viewWill/DidLayoutSubViews處理相關信息。

90、有些圖片加載比較慢怎麼處理?你是怎麼優化程序的性能的?

①、圖片下載放在異步線程。

②、圖片下載過程使用佔位圖片。

③、若是圖片比較大,可使用多線程斷點下載。

91.App須要加載大量數據,給服務器發送請求,可是服務器卡住了怎麼辦?

設置請求超時,給用戶提示請求超時,根據用戶操做再次請求。

9二、SDWebImage具體如何實現?

其實就是沙盒緩存機制,主要由三塊組成:內存圖片緩存,內存操做緩存,磁盤沙盒緩存。

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

②、利用URL做爲key,NSOperation做爲value.

③、利用URL做爲key,UIImage做爲value

9三、AFNetWorking實現原理。

基於NSURL.採用block的方法處理請求,直接返回的是json、XML數據。AFN直接操做對象是AFHTTPClient,是一個實現了NSCoding和NSCopying協議的NSObject子類。AFGTTPClient是一個封裝了一系列操做方法的工具類。AFN默認沒有封裝同步請求,若是開發者須要使用同步請求,須要重寫相關的方法(getPath:parameters:failure),對AFHTTPRequestOperation進行同步處理。

9四、什麼是響應鏈,它是怎麼工做的?

http://www.jianshu.com/p/9179e5d780c8

9五、iOS 的沙盒目錄結構是怎樣的? App Bundle 裏面都有什麼?

1.沙盒結構

Application:存放程序源文件,上架前通過數字簽名,上架後不可修改

Documents:經常使用目錄,iCloud備份目錄,存放數據,這裏不能存緩存文件,不然上架不被經過

Library

Caches:存放體積大又不須要備份的數據,SDWebImage緩存路徑就是這個

Preference:設置目錄,iCloud會備份設置信息

tmp:存放臨時文件,不會被備份,並且這個文件下的數據有可能隨時被清除的可能

2.App Bundle 裏面有什麼

Info.plist:此文件包含了應用程序的配置信息.系統依賴此文件以獲取應用程序的相關信息

可執行文件:此文件包含應用程序的入口和經過靜態鏈接到應用程序target的代碼

資源文件:圖片,聲音文件一類的

其餘:能夠嵌入定製的數據資源

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

假設,咱們有一個APP須要發佈,爲了防止中途篡改APP內容,保證APP的完整性,以及APP是由指定的私鑰發的。首先,先將APP內容經過摘要算法,獲得摘要,再用私鑰對摘要進行加密獲得密文,將源文本、密文、和私鑰對應的公鑰一併發佈便可。那麼如何驗證呢?

驗證方首先查看公鑰是不是私鑰方的,而後用公鑰對密文進行解密獲得摘要,將APP用一樣的摘要算法獲得摘要,兩個摘要進行比對,若是相等那麼一切正常。這個過程只要有一步出問題就視爲無效。

iOS 7的多任務添加了哪兩個新的 API? 各自的使用場景是什麼?

後臺獲取(Background Fetch):後臺獲取使用場景是用戶打開應用以前就使app有機會執行代碼來獲取數據,刷新UI。這樣在用戶打開應用的時候,最新的內容將已然呈如今用戶眼前,而省去了全部的加載過程。

推送喚醒(Remote Notifications):使用場景是使設備在接收到遠端推送後讓系統喚醒設備和咱們的後臺應用,並先執行一段代碼來準備數據和UI,而後再提示用戶有推送。這時用戶若是解鎖設備進入應用後將不會再有任何加載過程,新的內容將直接獲得呈現。

9六、UIScrollView 大概是如何實現的,它是如何捕捉、響應手勢的?

我對UIScrollView的理解是frame就是他的contentSize,bounds就是他的可視範圍,經過改變bounds從而達到讓用戶誤覺得在滾動,如下是一個簡單的UIScrollView實現

在頭文件定義一個contentSize屬性

@interface MyScrollView : UIView

@property (nonatomic) CGSize contentSize;

@end

@implementation MyScrollView

  • (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協議,實現這個方法,在這裏方法裏對添加的手勢進行處理就能夠解決衝突

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

9七、Objective-C 如何對已有的方法,添加本身的功能代碼以實現相似記錄日誌這樣的功能?

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

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

  • (NSString *)myLog

    {

    這裏寫打印行號,什麼方法,哪一個類調用等等

    }

而後交換方法

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

  • (void)load

    {

    獲取imageWithName方法地址

    Method description = class_getClassMethod(self, @selector(description));

    獲取imageWithName方法地址

    Method myLog = class_getClassMethod(self, @selector(myLog));

    交換方法地址,至關於交換實現方式

    method_exchangeImplementations(description, myLog);

    }

9八、+load 和 +initialize 的區別是什麼?

+(void)load;

當類對象被引入項目時, runtime 會向每個類對象發送 load 消息

load 方法會在每個類甚至分類被引入時僅調用一次,調用的順序:父類優先於子類, 子類優先於分類

load 方法不會被類自動繼承

+(void)initialize;

也是在第一次使用這個類的時候會調用這個方法

9九、如何讓 Category 支持屬性?

使用runtime能夠實現

頭文件

@interface NSObject (test)

@property (nonatomic, copy) NSString *name;

@end

.m文件

@implementation NSObject (test)

定義關聯的key

static const char *key = "name";

  • (NSString *)name  
    {  
    根據關聯的key,獲取關聯的值。  
    return objc_getAssociatedObject(self, key);  
  • (void)setName:(NSString *)name  
    {  
    第一個參數:給哪一個對象添加關聯  
    第二個參數:關聯的key,經過這個key獲取  
    第三個參數:關聯的value  
    第四個參數:關聯的策略  
    objc_setAssociatedObject(self, key, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);  

100、NSOperation 相比於 GCD 有哪些優點?

提供了在 GCD 中不那麼容易複製的有用特性。

能夠很方便的取消一個NSOperation的執行

能夠更容易的添加任務的依賴關係

提供了任務的狀態:isExecuteing, isFinished.

10一、strong / weak / unsafe_unretained 的區別?

weak只能修飾OC對象,使用weak不會使計數器加1,對象銷燬時修飾的對象會指向nil,strong等價與retain,能使計數器加1,且不能用來修飾數據類型

unsafe_unretained等價與assign,能夠用來修飾數據類型和OC對象,可是不會使計數器加1,且對象銷燬時也不會將對象指向nil,容易形成野指針錯誤

10二、如何爲 Class 定義一個對外只讀對內可讀寫的屬性?

在頭文件中將屬性定義爲readonly,在.m文件中將屬性從新定義爲readwrite

10三、Objective-C 中,meta-class 指的是什麼?

meta-class 是 Class 對象的類,爲這個Class類存儲類方法,當一個類發送消息時,就去那個類對應的meta-class中查找那個消息,每一個Class都有不一樣的meta-class,全部的meta-class都使用基類的meta-class(假如類繼承NSObject,那麼他所對應的meta-class也是NSObject)做爲他們的類

10四、UIView 和 CALayer 之間的關係?

UIView顯示在屏幕上歸功於CALayer,經過調用drawRect方法來渲染自身的內容,調節CALayer屬性能夠調整UIView的外觀,UIView繼承自UIResponder,CALayer不能夠響應用戶事件

UIView是iOS系統中界面元素的基礎,全部的界面元素都繼承自它。它內部是由Core Animation來實現的,它真正的繪圖部分,是由一個叫CALayer(Core Animation Layer)的類來管理。UIView自己,更像是一個CALayer的管理器,訪問它的根繪圖和座標有關的屬性,如frame,bounds等,實際上內部都是訪問它所在CALayer的相關屬性

UIView有個layer屬性,能夠返回它的主CALayer實例,UIView有一個layerClass方法,返回主layer所使用的類,UIView的子類,能夠經過重載這個方法,來讓UIView使用不一樣的CALayer來顯示

10五、+[UIView animateWithDuration:animations:completion:] 內部大概是如何實現的?

animateWithDuration:這就等於建立一個定時器

animations:這是建立定時器須要實現的SEL

completion:是定時器結束之後的一個回調block

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

10六、何時會發生「隱式動畫」?

當改變CALayer的一個可作動畫的屬性,它並不能馬上在屏幕上體現出來.相反,它是從先前的值平滑過渡到新的值。這一切都是默認的行爲,你不須要作額外的操做,這就是隱式動畫

10七、如何處理異步的網絡請求?

異步請求:會單獨開一個線程去處理網絡請求,主線程依然處於可交互狀態,程序運行流暢

POST請求

NSString 

urlString = @"www.baidu.com";

建立url對象

url = [NSURL URLWithString:urlString]; 

建立請求

NSMutableURLRequest 

request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];

建立參數字符串對象

parmStr = [NSString stringWithFormat:@"參數"]; 

將字符串轉換爲NSData對象

NSData *data = [parmStr dataUsingEncoding:NSUTF8StringEncoding];

[request setHTTPBody:data];

[request setHTTPMethod:@"POST"];

建立異步鏈接

[NSURLConnection connectionWithRequest:request delegate:self];

而後實現代理方法

服務器接收到請求時

  • (void)connection:(NSURLConnection  )connection didReceiveResponse:(NSURLResponse )response  
    {  
    }  
    當收到服務器返回的數據時觸發, 返回的多是資源片斷 
  • (void)connection:(NSURLConnection  )connection didReceiveData:(NSData )data  
    {  
    }  
    當服務器返回全部數據時觸發, 數據返回完畢 
  • (void)connectionDidFinishLoading:(NSURLConnection *)connection  
    {  
    }  
    請求數據失敗時觸發 
  • (void)connection:(NSURLConnection  )connection didFailWithError:(NSError )error 
    {  
    NSLog(@"%s",  FUNCTION );  

10八、frame 和 bounds 的區別是什麼?

frame相對於父視圖,是父視圖座標系下的位置和大小。bounds相對於自身,是自身座標系下的位置和大小。

frame以父控件的左上角爲座標原點,bounds以自身的左上角爲座標原點

10九、如何把一張大圖縮小爲1/4大小的縮略圖?

let data = UIImageJPEGRepresentation(image, 0.25)

相關文章
相關標籤/搜索