****************OC語言特性***************
1.屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在哪種情況下用?
1).readwrite(默認(rèn)關(guān)鍵字) 是可讀可寫特性,同時創(chuàng)建set方法和get方法。
2). readonly 是只讀特性,只會生成getter方法,不會生成setter方法 ;不希望屬性在類外改變;
3). assign 是賦值特性,setter方法將傳入?yún)?shù)直接賦值給實例變量;僅設(shè)置變量時;
4). retain 一般mrc中使用。表示持有特性,setter方法將傳入?yún)?shù)先保留,再賦值,傳入?yún)?shù)的retaincount會+1;
5).copy 表示賦值特性,setter方法將傳入對象復(fù)制一份;需要完全一份新的變量時;
6).nonatomic 非原子操作,決定編譯器生成的setter getter是否是原子操作,atomic(默認(rèn)關(guān)鍵字)保證賦值和獲取是保證線程安全的,一般使用nonatomic。
2.assgin和weak什么區(qū)別呢?
assign的特點(diǎn):
修飾基本數(shù)據(jù)類型(int BOOL)
修飾對象類型時,不改變其引用計數(shù)
會產(chǎn)生懸垂指針(釋放之后,繼續(xù)訪問會產(chǎn)生懸垂指針,會造成內(nèi)存泄漏和程序異常)
weak的特點(diǎn)
不改變被修飾對象的引用計數(shù)
所指對象在被釋放之后會自動置為nil
區(qū)別:
weak 只可以修飾對象。 assign 可修飾對象,和基本數(shù)據(jù)類型。
assign修飾的對象釋放之后,指針仍然指向原來的內(nèi)存地址。 weak所指對象在被釋放之后會自動置為nil
3.類別的作用?繼承和類別在實現(xiàn)中有何區(qū)別?
答:category 可以在不獲悉,不改變原來代碼的情況下添加新的方法,只能添加,不能刪除修改,并且如果類別和原來類中的方法產(chǎn)生名稱沖突,則類別將覆蓋原來的方法,因為類別具有更高的優(yōu)先級。
繼承可以增加,修改或者刪除方法,并且可以增加屬性。
4.分類和拓展的相關(guān)問答
- 類別/分類(category)和類擴(kuò)展(extension)的區(qū)別?
分類是運(yùn)行時決議,拓展是編譯時決議
分類是有聲明和實現(xiàn),拓展是只以聲明的形式存在。沒有具體實現(xiàn)。
不能為系統(tǒng)類添加拓展,可以給系統(tǒng)類添加分類。
- 分類的實現(xiàn)原理?
是由運(yùn)行時來決議的。然后不同分類當(dāng)中,含有同名方法。誰最后編譯,誰最后生效。分類方法高于宿主類方法級別。
- 你用分類都做了哪些事情?
聲明私有方法
分解體積龐大的類文件。
把framework的私有方法公開化
- 分類都可以添加哪些內(nèi)容?
1.實例方法
2.類方法
3.協(xié)議
4.屬性(如果非要加屬性就要用到runtime ,用它進(jìn)行關(guān)聯(lián)。)
- 能否給分類添加”成員變量“,成員變量被添加到了哪里?
可以。使用關(guān)聯(lián)對象技術(shù)。被添加到了 同一個全局容器中。(其實也是runtime)
- 分類的特點(diǎn)?
運(yùn)行時決議
可以為系統(tǒng)類添加分類
- 一般用拓展做什么?
聲明私有屬性
聲明私有方法
聲明私有成員變量
-
通過runtime給分類(category)添加屬性:
#import "Person.h"
@interface Person (Play)
@property (nonatomic,copy) NSString *name;
@end
#import "Person+Play.h"
#import <objc/runtime.h>
static NSString *nameKey = @"nameKey"; //定義一個key值
@implementation Person (Play)
//運(yùn)行時實現(xiàn)setter方法
- (void)setName:(NSString *)name{
objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
//運(yùn)行時實現(xiàn)getter方法
- (NSString *)name {
return objc_getAssociatedObject(self, &nameKey);
}
@end
5.什么是代理?代理的作用?
代理是一種軟件設(shè)計模式。以@protocol形式體現(xiàn),傳遞方式是一對一的。
代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針??梢詼p少框架復(fù)雜度。


6.通知和代理的區(qū)別?
通知是使用觀察者模式來實現(xiàn)的用于跨層傳遞消息的機(jī)制。傳遞方式是一對多的、
代理是代理模式實現(xiàn)的,只能一對一傳遞、

7.介紹一下觀察者模式?
觀察者模式(Observer Pattern):定義對象間的一種一對多依賴關(guān)系,使得每當(dāng)一個對象狀態(tài)發(fā)生改變時,其相關(guān)依賴對象皆得到通知并被自動更新。
在iOS中典型的此模型實現(xiàn)方式為NSNotificationCenter和KVO。
NSNotificationCenter

8.通知的實現(xiàn)機(jī)制?/如何實現(xiàn)通知機(jī)制?
通知中心會維護(hù)一個map表或者字典。key是notificationName??赡軙砑佣鄠€value。value是Observers_List。

9.KVO的簡介?
KVO是oc對觀察者設(shè)計模式的實現(xiàn),蘋果使用了isa混寫(isa-swizzling)來實現(xiàn)的KVO. 他提供了觀察某一屬性變化的方法,極大的簡化了代碼。
isa混寫技術(shù)在KVO中是怎樣體現(xiàn)的?
當(dāng)觀察某個對象A時,KVO機(jī)制利用runtime動態(tài)創(chuàng)建一個對象A的子類(NSKVONotifying_A),并對新的子類重寫了setter方法,原有類的isa指針指向新的子類。setter方法隨后負(fù)責(zé)通知觀察對象屬性的改變狀況。
KVO實現(xiàn)原理及自己實現(xiàn)KVO
KVODemo

10.KVC的簡介?
KVC(key-value-coding)蘋果提供的鍵值編碼技術(shù)。是一種間接訪問對象的屬性使用字符串來標(biāo)識屬性,而不是通過調(diào)用存取方法,直接或通過實例變量訪問的機(jī)制。
KVC的實現(xiàn)原理
1.首先搜索 setter 方法,有就直接賦值。
2.如果上面的 setter 方法沒有找到,再檢查類方法+ (BOOL)accessInstanceVariablesDirectly
i.返回 NO,則執(zhí)行setValue:forUNdefinedKey:
ii.返回 YES,則按```_<key>```,```_<isKey>```,```<key>```,```<isKey>```的順序搜索成員名。
3.還沒有找到的話,就調(diào)用setValue:forUndefinedKey:
11.深拷貝和淺拷貝的問題:
淺拷貝會增加引用計數(shù)
淺拷貝指向同一塊內(nèi)存空間
深拷貝不會增加引用計數(shù)
深拷貝產(chǎn)生內(nèi)存分配
NSString * string = @"hello world";
/** 淺拷貝 */
NSString * copyString = [string copy];
/** 深拷貝 */
NSMutableString * mutableCopyString = [string mutableCopy];
NSLog(@"\nstring = %p\ncopyString = %p\nmutableCopyString= %p",string,copyString,mutableCopyString);
打印結(jié)果:
string = 0x106e65398
copyString = 0x106e65398
mutableCopyString= 0x6000022436f0
NSMutableString * mString = [NSMutableString stringWithString:@"hello world"];
/** 淺拷貝 */
NSString * copyMString = [mString copy];
/** 深拷貝 */
NSMutableString * mutableCopyMString = [mString mutableCopy]; NSLog(@"\nmString = %p\ncopyMString = %p\nmutableCopyMString= %p",mString,copyMString,mutableCopyMString);
打印結(jié)果:
mString = 0x600002243720
copyMString = 0x600002c25c60
mutableCopyMString= 0x6000022438a0
可變對象的copy和mutableCopy都是深拷貝
不可變對象的copy是淺拷貝,mutableCopy是深拷貝
copy方法返回的都是不可變對象
- 使用@property(copy) NSMutableArray *array; 會出現(xiàn)什么問題?
copy方法返回的都是不可變對象,如果操作數(shù)據(jù)就會程序異常。
- copy,strong和拷貝之間的關(guān)系
copy,strong和深淺拷貝沒有完全對應(yīng)關(guān)系
簡單來說,希望不跟著源頭改變,就用copy,跟著改變就用strong
12.MRC下如何重寫retain修飾變量的setter方法?

13.#include,#import與@class的區(qū)別?
#include是C中用來引用文件的關(guān)鍵字;
#import是OC中用來引用文件關(guān)鍵字;
@class僅僅是告訴編譯器有這么一個類, 具體這個類里有什么信息, 完全不知。
引入@class主要是用來解決引用死鎖。如果兩個類存在循環(huán)依賴關(guān)系,即A->B,B->A,如果用#import來相互包含,就會出現(xiàn)編譯錯誤:
Expected specifier-qualifier-list before ‘A’或者Expected specifier-qualifier-list before ‘B’。
一般情況下,在 .h文件中,只需要知道類的名字就可以了,所以用@class,而在 .m文件中通常需要知道類的成員變量即方法,所以要用#import來將類文件導(dǎo)進(jìn)來。
*****************內(nèi)存管理***********
iOS 內(nèi)存管理
iOS內(nèi)功篇:內(nèi)存管理
*****************UI相關(guān)問題***********
1.tableView 的重用機(jī)制?
tableView的重用機(jī)制就是每次只創(chuàng)建屏幕顯示區(qū)域內(nèi)的cell,通過重用標(biāo)識符identifier來標(biāo)記cell, 當(dāng)cell要從屏幕外移入屏幕內(nèi)時, 系統(tǒng)會從重用池內(nèi)找到相同標(biāo)識符的cell, 然后拿來顯示。
2.如何操作tableView的數(shù)據(jù)源同步問題??
1.并發(fā)訪問,數(shù)據(jù)拷貝
并發(fā)及多個線程都可以執(zhí)行在同一段時間,不需要互相等待,主線程與用戶互動,子線程加載cell所需要的網(wǎng)絡(luò)數(shù)據(jù)以及預(yù)排版
解決方法:如圖,主線程首先拷貝一份數(shù)據(jù)給子線程完成預(yù)排版,網(wǎng)絡(luò)請求與數(shù)據(jù)解析(json xml轉(zhuǎn)化),這時候如果主線程需要刪除某些數(shù)據(jù)源操作,他就記錄這條刪除操作,在子線程完成各種加載操作后將這條操作與子線程進(jìn)行同步一下,然后再回到主線程刷新界面
缺點(diǎn):可能需要拷貝大量數(shù)據(jù),比較消耗內(nèi)存

2.串行訪問
創(chuàng)建一個GCD串行隊列,主線程增刪改操作需要等待子線程操作完成
解決方法:首先使用GCD創(chuàng)建一個串行隊列,子線程先加入隊列完成網(wǎng)絡(luò)加載操作,如果這時候主線程需要修改數(shù)據(jù)源,這個操作就要等待子線程完成才去進(jìn)行(串行執(zhí)行)
缺點(diǎn):可能子線程的網(wǎng)絡(luò)請求速度慢,主線程UI操作等待時間長

3.事件傳遞的機(jī)制以及視圖響應(yīng)鏈?
UIApplication接收到事件,將事件傳遞給keyWindow。
keyWindow遍歷subViews的hitTest:withEvent:方法,找到點(diǎn)擊區(qū)域內(nèi)合適的視圖來處理事件。
UIView的子視圖也會遍歷其subViews的hitTest:withEvent:方法,以此類推。
直到找到點(diǎn)擊區(qū)域內(nèi),且處于最上方的視圖,將視圖逐步返回給UIApplication。
在查找第一響應(yīng)者的過程中,已經(jīng)形成了一個響應(yīng)者鏈。
應(yīng)用程序會先調(diào)用第一響應(yīng)者處理事件。
如果第一響應(yīng)者不能處理事件,則調(diào)用其nextResponder方法,一直找響應(yīng)者鏈中能處理該事件的對象。
最后到UIApplication后仍然沒有能處理該事件的對象,則該事件被廢棄。

4.ui的卡頓和掉幀的原因?
在規(guī)定的時間內(nèi),在下一幀VSync信號到來之前,CPU和GPU沒有合成下一幀畫面合成。于是就會卡頓和掉幀。
1、UI渲染需要時間較長,無法按時提交結(jié)果。
2、一些需要密集計算的處理放在了主線程中執(zhí)行,導(dǎo)致主線程被阻塞,無法渲染UI界面。
3、網(wǎng)絡(luò)請求由于網(wǎng)絡(luò)狀態(tài)的問題響應(yīng)較慢,UI層由于沒有模型返回?zé)o法渲染。
5.什么時候會觸發(fā)離屏渲染?
當(dāng)我們設(shè)置某一些UI視圖的圖層屬性,如果指定為在離屏顯示前不能直接顯示的時候。那么就觸發(fā)了離屏渲染。包括視圖的圓角屬性 和 蒙層遮罩。 而離屏渲染的概念,起源于GPU層面.指的是GPU在當(dāng)前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進(jìn)行渲染操作。
觸發(fā)的場景:
1.設(shè)置圓角(當(dāng)和maskToBounds一起使用時)
2.設(shè)置圖層蒙版
3.陰影
4.光欄化
PS:
什么是離屏渲染
指的是GPU在當(dāng)前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進(jìn)行渲染操作
什么是在屏渲染
指在當(dāng)前屏幕渲染,指的是GPU的渲染操作是在當(dāng)前用于顯示的屏幕緩沖區(qū)中進(jìn)行
為何要避免?
觸發(fā)離屏渲染會增加GPU的工作量。會可能導(dǎo)致CPU+GPU的工作量超出了16.7毫秒。導(dǎo)致UI的卡頓和掉幀。
*****************Block***********
*****************runtime***********
iOS runtime詳細(xì)內(nèi)容
詳細(xì)
*****************多線程***********
iOS 多線程入門02--NSThread
iOS 多線程入門03--GCD
iOS 多線程入門04--NSOperation
多線程提升
iOS 多線程的安全隱患(線程鎖)
*****************RunLoop***********
*****************網(wǎng)絡(luò)相關(guān)***********
iOS 網(wǎng)絡(luò)相關(guān)知識學(xué)習(xí)
*****************其他***********
1.static 關(guān)鍵字的作用?
靜態(tài)局部變量
當(dāng)static關(guān)鍵字修飾局部變量時,只會初始化一次。
當(dāng)static關(guān)鍵字修飾局部變量時,在程序中只有一份內(nèi)存。
Static關(guān)鍵字可延長局部變量的生命周期,直到程序結(jié)束才銷毀。

靜態(tài)全局變量
當(dāng)static關(guān)鍵字修飾全局變量時,作用域僅限于當(dāng)前文件,外部類是不可以訪問到該全局變量的。
2.簡述內(nèi)存分區(qū)情況?
1).代碼區(qū):存放函數(shù)二進(jìn)制代碼
2).數(shù)據(jù)區(qū):系統(tǒng)運(yùn)行時申請內(nèi)存并初始化,系統(tǒng)退出時由系統(tǒng)釋放。存放全局變量、靜態(tài)變量、常量
3).堆區(qū):通過alloc等函數(shù)或new等操作符動態(tài)申請得到,需程序員手動申請和釋放
4).棧區(qū):函數(shù)模塊內(nèi)申請,函數(shù)結(jié)束時由系統(tǒng)自動釋放。存放局部變量、函數(shù)參數(shù)
3.通知的執(zhí)行方法是在主線程運(yùn)行還是在分線程運(yùn)行?
如果將發(fā)送通知的方法postNotification寫在了主線程,它的執(zhí)行方法會在主線程運(yùn)行,如果將postNotification方法寫在了子線程內(nèi),會在子線程內(nèi)運(yùn)行。
4.字典的實現(xiàn)原理?
NSDictionary(字典)是使用hash表來實現(xiàn)key和value之間的映射和存儲的。
5.alloc和new的區(qū)別?
[className new]基本等同于[[className alloc] init]. 區(qū)別只在于alloc分配內(nèi)存的時候使用了zone,它是給對象分配內(nèi)存的時候,把關(guān)聯(lián)的對象分配到一個相鄰的內(nèi)存區(qū)域內(nèi),以便于調(diào)用時消耗很少的代價,提升了程序處理速度。
6.空指針與野指針的區(qū)別?
1.空指針
1.沒有存儲任何內(nèi)存地址的指針就稱為空指針(NULL指針)
2.空指針就是被賦值為0的指針,在沒有被具體初始化之前,其值為0。
2.野指針
"野指針"不是NULL指針,是指向"垃圾"內(nèi)存(不可用內(nèi)存)的指針。野指針是非常危險的。
總結(jié)
1.利用野指針發(fā)消息是很危險的,會報錯。也就是說,如果一個對象已經(jīng)被回收了,就不要再去操作它,不要再嘗試給它發(fā)消息。
2.利用空指針發(fā)消息是沒有任何問題的,也就是說下面的代碼是沒有錯誤的。
7.堆和棧的區(qū)別?
棧區(qū):由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量值等;
堆區(qū):一般由程序員分配釋放(使用new/delete或malloc/free),若程序員不釋放,程序結(jié)束時可能由OS回收;
棧里面存放的是非對象的基本數(shù)據(jù)類型(包括指針),堆內(nèi)存存放著oc對象
8. http和scoket通信的區(qū)別?
http是客戶端用http協(xié)議進(jìn)行請求,發(fā)送請求時候需要封裝http請求頭,并綁定請求的數(shù)據(jù),服務(wù)器一般有web服務(wù)器配合(當(dāng)然也非絕對)。 http請求方式為客戶端主動發(fā)起請求,服務(wù)器才能給響應(yīng),一次請求完畢后則斷開連接,以節(jié)省資源。服務(wù)器不能主動給客戶端響應(yīng)(除非采取http長連接 技術(shù))。iphone主要使用類是NSUrlConnection。
scoket是客戶端跟服務(wù)器直接使用socket“套接字”進(jìn)行連接,并沒有規(guī)定連接后斷開,所以客戶端和服務(wù)器可以保持連接通道,雙方 都可以主動發(fā)送數(shù)據(jù)。一般在游戲開發(fā)或股票開發(fā)這種要求即時性很強(qiáng)并且保持發(fā)送數(shù)據(jù)量比較大的場合使用。主要使用類是CFSocketRef。
9. 隊列和棧有什么區(qū)別?
答:隊列和棧是兩種不同的數(shù)據(jù)容器。從”數(shù)據(jù)結(jié)構(gòu)”的角度看,它們都是線性結(jié)構(gòu),即數(shù)據(jù)元素之間的關(guān)系相同。
隊列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),它在兩端進(jìn)行操作,一端進(jìn)行入隊列操作,一端進(jìn)行出列隊操作。
棧是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),它只能在棧頂進(jìn)行操作,入棧和出棧都在棧頂操作。
10.SDWebImage的實現(xiàn)原理?
11.KVO和KVC的區(qū)別?
KVO:鍵值觀察機(jī)制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。
KVC:鍵 – 值編碼,是一種間接訪問對象的屬性使用字符串來標(biāo)識屬性,而不是通過調(diào)用存取方法,直接或通過實例變量訪問的機(jī)制。
12.視圖的生命周期?
iOS程序執(zhí)行順序和UIViewController 的生命周期(整理)
13. 請簡要說明viewDidLoad和viewDidUnload何時調(diào)用?
答:viewDidLoad在view從nib文件初始化時調(diào)用,loadView在controller的view為nil時調(diào)用。此方法在編程實現(xiàn)view時調(diào)用,view控制器默認(rèn)會注冊memory warning notification,當(dāng)view controller的任何view沒有用的時候,viewDidUnload會被調(diào)用,在這里實現(xiàn)將retain的view release,如果是retain的IBOutlet view 屬性則不要在這里release,IBOutlet會負(fù)責(zé)release 。
14.描述一下面向過程編程和面向?qū)ο缶幊痰膮^(qū)別以及優(yōu)缺點(diǎn)?
面向過程編程:以事件為中心的編程思想。就是分析出解決問題所需的步驟,然后用函數(shù)把這些步驟實現(xiàn),并按順序調(diào)用,實現(xiàn)整個程序的功能。
優(yōu)點(diǎn):性能比面向?qū)ο蟾?,因為類調(diào)用時需要實例化,開銷比較大,比較消耗資源;比如單片機(jī)、嵌入式開發(fā)、Linux/Unix等一般采用面向過程開發(fā),性能是最重要的因素。
缺點(diǎn):沒有面向?qū)ο笠拙S護(hù)、易復(fù)用、易擴(kuò)展 。
面向?qū)ο缶幊蹋好嫦驅(qū)ο笫且环N以“對象”為中心的編程思想,把具體的數(shù)據(jù)和操作封裝起來,來構(gòu)造和實現(xiàn)整個軟件的功能。面向?qū)ο蟀齻€基本特征:繼承,多態(tài),封裝。
優(yōu)點(diǎn):易維護(hù)、易復(fù)用、易擴(kuò)展,由于面向?qū)ο笥蟹庋b、繼承、多態(tài)性的特性,可以設(shè)計出低耦合的系統(tǒng),使系統(tǒng)更加靈活、更加易于維護(hù) 。
缺點(diǎn):性能比面向過程低 。
備注:
1.多態(tài)就是父類指針指向子類指針。一個對象有著多重特征,可以在特定的情況下,表現(xiàn)不同的狀態(tài),從而對應(yīng)著不同的屬性和方法。
2.多態(tài)在繼承中的使用:
1):父類指針可以接收子類對象(賦值兼容規(guī)則)
2):父類的指針指向不同的子類對象,調(diào)用相同的方法,效果不同
15. imageNamed和imageWithContentsOfFile/+imageWithData:(scale:)/-initWithContentsOfFile:/-initWithData:的區(qū)別?
1. +imageNamed:該方法使用系統(tǒng)緩存,適合表視圖重復(fù)加載圖像的情形。同時該API根據(jù)UIScreen的scale,自動查找包含對應(yīng)高倍圖后綴名(@2x)的文件,如果找到二倍圖,則image.scale=2.0,對應(yīng)邏輯size大小以point度量(pixel度量的一半);如果沒找到設(shè)置默認(rèn)image.scale=1.0,對應(yīng)邏輯size大小同像素尺寸。因此,使用該方法,無需特意指定高倍圖后綴。在實際運(yùn)行時,系統(tǒng)如果發(fā)現(xiàn)當(dāng)前設(shè)備是Retina屏(scale=2),會自動尋找"*@2x.png"命名格式的圖片,加載針對Retina屏的圖片素材,否則會失真。
2. +imageWithContentsOfFile/+imageWithData:(scale:)/-initWithContentsOfFile:/-initWithData:(scale:)
16.懶加載的時候,使用self調(diào)用屬性造成崩潰。
錯誤寫法
-(UIView *)bgView {
if (!self.bgView) {
self.bgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
self.bgView.backgroundColor = [UIColor redColor];
}
return self.bgView;
}
正確寫法
-(UIView *)bgView {
if (!_bgView) {
self.bgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
self.bgView.backgroundColor = [UIColor redColor];
}
return _bgView;
}
為什么會崩潰?
因為:我們在調(diào)用if語句做判斷時,如果用self去訪問的話,此時會調(diào)用他的setter跟getter方法,本身自己還沒初始化,是nil,但是getter返回的也是nil,那在判斷時就會進(jìn)入死循環(huán),所以就會報這個錯.
17.成員變量,實例變量和屬性的區(qū)別?
@interface ViewController : UIViewController
{
int count; //成員變量
id data; //實例變量
NSString *name; //實例變量
}
@property (nonatomic, copy) NSString *address; //屬性
@end
實例是針對 類而言的。 實例是指類的聲明; 由此推理, 實例變量 :是指由類聲明的對象。
嚴(yán)格來講, 上圖中的 int count是一個成員變量。 而 NSString * name是一個實例變量。 至于id data應(yīng)該屬于實例變量。因為 id 是OC特有的類型。從本質(zhì)上講, id 等同于 (void *)。
18.@public,@private,@protected,@package的區(qū)別?
@public:在任何地方都能直接訪問對象的成員變量;
@private:只能在當(dāng)前類的對象方法中直接訪問,如果子類要訪問需要在父類中實現(xiàn)set和get方法,在子類中調(diào)用;
@protected:可以在當(dāng)前類及其子類對象方法中直接訪問(系統(tǒng)默認(rèn)下是用它來修飾的);
@package:在同一個包下就可以直接訪問,比如說在同一個框架。
19.if和switch的使用?
switch通過編譯成一個分支表來達(dá)到優(yōu)化的目的,是通過空間的代價來換取時間。if-else語句會對一個個條件按順序進(jìn)行查找,直到找到符合條件的"入口"。
大多數(shù)情況下switch比if-else運(yùn)行的要快,但只有當(dāng)數(shù)量條件很大時,才快得明顯。當(dāng)條件增加的時候,if-else性能負(fù)擔(dān)增加的程度比switch明顯得多。因此我們傾向于在條件數(shù)量比較少的情況下使用if-else,而在條件數(shù)量較大的時候使用switch。
20.dispatch_get_main_queue 與 performSelectorOnMainThread 的區(qū)別?
都是獲取主線程,但是他們的RunLoopMode不一樣。
dispatch_get_main_queue:在當(dāng)前的runloopmode中執(zhí)行 。所有模式下都可運(yùn)行。
performSelectorOnMainThread:會在defaultMode中執(zhí)行,。如果運(yùn)行循環(huán)處于另一種模式(例如跟蹤模式),則在運(yùn)行循環(huán)切換回默認(rèn)模式之前它不會運(yùn)行??梢允褂迷撟凅w來解決此問題-performSelectorOnMainThread:withObject:waitUntilDone:modes:(通過傳遞您希望它在其中運(yùn)行的所有模式)。
21.@protocol除了用作代理還能干什么?
面向協(xié)議開發(fā)(為了方法定義)
做邏輯抽象(輯抽象就是為了某一類行為做個抽象比如有啥功能做方法定義抽象,但是不是具體的實現(xiàn)類,然后根據(jù)自己具體實現(xiàn)類來遵守協(xié)議實現(xiàn)對應(yīng)方法。比如支付,分享)
服務(wù)實現(xiàn)插件
非必要實現(xiàn)的功能或者屬性都可以用@protocol聲明利于后面擴(kuò)展
22.APNS的推送原理?

1.應(yīng)用程序的服務(wù)器端把要發(fā)送的消息、目的iPhone的標(biāo)識打包,發(fā)給APNS。
2.APNS在自身的已注冊Push服務(wù)的iPhone列表中,查找有相應(yīng)標(biāo)識的iPhone,并把消息發(fā)送到iPhone。
3.iPhone把發(fā)來的消息傳遞給相應(yīng)的應(yīng)用程序,并且按照設(shè)定彈出Push通知。

1.app注冊接收推送時,系統(tǒng)會發(fā)送請求給APNS服務(wù)。APNS服務(wù)收到請求后會生成一個deviceToken(UDID + App's Bundle Identifier))。
2.app接收deviceToken。
3.app將deviceToken發(fā)送給app的后臺服務(wù)端。
4.后臺服務(wù)端將消息發(fā)送給APNS服務(wù)。
5.APNS服務(wù)將消息發(fā)送給app。
23.SDWebImage的實現(xiàn)?


SDImageCache負(fù)責(zé)圖片緩存相關(guān)的工作,SDWebImageDownloader負(fù)責(zé)圖片下載相關(guān)的工作,SDWebImageManager則是將前兩者結(jié)合起來完成整個工作流程。
首先進(jìn)行請求的url對應(yīng)的urlkey去查找內(nèi)存緩存。如果內(nèi)存當(dāng)中查找到了就返回給調(diào)用方。
如果內(nèi)存緩存中查找不到,就去查找磁盤緩存,磁盤查找找到了,就返回給調(diào)用方。如果仍然查找不到,就發(fā)起新的網(wǎng)絡(luò)請求下載。
24.AFNetworking 底層原理分析?
25.frame和bounds區(qū)別?
frame: 該view在父view坐標(biāo)系統(tǒng)中的位置和大小。(參照點(diǎn)是父類的坐標(biāo)系統(tǒng))
bounds:該view在本地坐標(biāo)系統(tǒng)中的位置和大小。(參照點(diǎn)是本地坐標(biāo)系統(tǒng),就相當(dāng)于ViewB自己的坐標(biāo)系統(tǒng),以0,0點(diǎn)為起點(diǎn))。
經(jīng)典面試題匯總
《招聘一個靠譜的iOS》面試題參考答案(上)
《招聘一個靠譜的iOS》面試題參考答案(下)
部分內(nèi)容摘自于網(wǎng)絡(luò),如有侵權(quán),可通過簡書聯(lián)系我,謝謝!