iOS面試題(一)

1裁蚁、#import和#include的區(qū)別,@class代表什么继准?

   指令#import和#include都是用于包含頭文件的枉证,前者是保證只會包含一次,不會重復(fù)包含移必;后者是C語言
中原來就有的包含頭文件的指令刽严,在OC開發(fā)中,若是C文件避凝,一般會使用#include指令來包含頭文件舞萄,為了防止
重復(fù)包含,通常會加上條件編譯管削。
   @class是聲明在類前的指令倒脓,相當(dāng)于告訴編譯器有這樣的一個類;但是類的定義在后面提供含思。在編譯時期崎弃,
編譯器看到@class指令聲明了對應(yīng)的類型,是可以正常編譯的含潘。這是很常用的指令饲做,主要是防止循環(huán)引用。

2遏弱、OC的內(nèi)存管理方式以及過程盆均。

    內(nèi)存管理黃金法則:誰使對象的引用計數(shù)+1,誰就負(fù)責(zé)管理使該對象的引用計數(shù)-1.
    內(nèi)存管理的過程:在MRC下漱逸,對于需要手動釋放的對象的內(nèi)存管理泪姨,我們通過release使對象引用計數(shù)-1游沿,
若其引用計數(shù)變?yōu)?,則對象會被立刻釋放掉肮砾。對于autorelease交給自動釋放池管理的對象诀黍,每個run loop
循環(huán)結(jié)束就會去自動釋放池中使所有autorelease類型對象的引用計數(shù)-1;若變成0仗处,則釋放之眯勾。在ARC下,我
們不能直接調(diào)用retain/release來管理釋放婆誓,都是交給自動釋放池來管理的吃环。因此,若創(chuàng)建臨時變量旷档,想要使
用完就釋放之模叙,需要在臨時變量放到新創(chuàng)建的自動釋放池里歇拆,這樣就可以使用完后就到達了自動釋放池的一個循
環(huán)鞋屈,就會去使對象引用計數(shù)-1,變成0后釋放故觅。
    最后:對于交給自動釋放池管理的對象厂庇,是在每個run loop事件循環(huán)結(jié)束時才會去使對象引用計數(shù)-1,此
時引用計數(shù)為0的才會得到釋放输吏。

3权旷、OC中有私有方法嗎?私有變量呢贯溅?

   在OC中拄氯,沒有實實存在的私有方法。通常所謂的私有方法就是放在.m文件中聲明和實現(xiàn)它浅,外部不能直接看到
而已译柏,但是若我們知道有這么一個API,我們是可以調(diào)用的姐霍。比如鄙麦,在蘋果上架會因為使用了蘋果的所謂的私有
API而被拒,而這個所謂的私有API就是指蘋果沒有公示出來镊折,但是我們通過其他方式可以看到蘋果的內(nèi)部有這樣
一個API可以實現(xiàn)某些不公開的功能胯府。 

   私有變量是有的,可以通過@private來聲明私有變量恨胚。比如:
 @interface HYBTestModel:NSObject {
    @private  NSString *_privateName;
 }

4骂因、OC中有多繼承嗎?沒有的話用什么代替?

    OC中沒有多繼承赃泡,這是去掉C++中多繼承的特性侣签,改成使用protocol來代替塘装。Cocoa中所有的類都是
NSObject的子類,這是正確的影所。

5蹦肴、淺拷貝與深拷貝的區(qū)別是什么?

淺拷貝就是指針拷貝(指向原有內(nèi)存空間)猴娩,而深拷貝是內(nèi)容拷貝(有新的內(nèi)存空間)阴幌。

6、屬性readwrite卷中、readonly矛双、assign、retain蟆豫、copy议忽、nonatomic各是什么作用,在哪種情況下使用十减?

作用分別是:
? readwrite:代表可讀可寫栈幸,會生成getter和setter方法。
? readonly:代表只讀帮辟,只生成getter方法速址,不會生成setter方法。
? assign:修飾基本數(shù)據(jù)類型(NSInteger由驹,CGFloat)和C數(shù)據(jù)類型(int芍锚,float,double蔓榄,char)等并炮。
? retain:MRC下才能手動使用,與ARC下的strong一樣甥郑,指定強引用逃魄,引用計數(shù)+1.
? copy:代表拷貝,也是強引用壹若,引用計數(shù)+1嗅钻,進行指針拷貝。
? nonatomic:代表非原子操作店展,非線程安全养篓,但可提高性能。

7赂蕴、什么情況使用weak關(guān)鍵字柳弄,相比assign有什么不同?

使用weak關(guān)鍵字的主要場景:
? 在ARC下,在有可能出現(xiàn)循環(huán)引用的時候往往要通過讓其中一端使用weak來解決碧注,比如:delegate代理屬
性嚣伐,通常就會聲明為weak。
? 自身已經(jīng)對它進行一次強引用萍丐,沒有必要再強引用一次時也會使用weak轩端。比如:自定義IBOutlet控件屬性
一般也使用weak,當(dāng)然也可以使用strong逝变。
? weak關(guān)鍵字只能用于對象基茵,對于基本類型不能使用。
? assign既可以用于對象壳影,也可以用于基本類型拱层,但是只是簡單地進行賦值操作而已。

8宴咧、@synthesize和@dynamic分別有什么作用根灯?

分析:@property有兩個對應(yīng)的詞,一個是@synthesize掺栅,另一個是@dynamic烙肺。
?   @synthesize的語義是如果你沒有手動實現(xiàn)setter方法和getter方法,那么編譯器會自動為你加上
這兩個方法柿冲。
?   @dynamic告訴編譯器:屬性的setter與getter方法由用戶自己實現(xiàn)茬高,不自動生成兆旬,假如一個屬性被
聲明為@dynamic var假抄,然后你沒有提供@setter方法和@getter方法,編譯的時候沒有問題丽猬,但是當(dāng)程序
運行到instance.var=someVar宿饱,由于缺setter方法會導(dǎo)致程序崩潰;或者當(dāng)運行到someVar=var時脚祟,由
于缺getter方法同樣會導(dǎo)致崩潰谬以。編譯時沒問題,運行時才執(zhí)行相應(yīng)的方法由桌,這就是所謂額動態(tài)綁定为黎。

9、OC中的類方法(加號方法)和實例方法(減號方法)有什么本質(zhì)區(qū)別和練習(xí)行您?

類方法:
?   類方法是屬于類對象的(所謂的類對象铭乾,不是class instance)
?   類方法只能通過類對象調(diào)用
?   類方法中的self是類對象
?   類方法可以調(diào)用其他的類方法
?   類方法中不能訪問成員變量
?   類方法中不能直接調(diào)用對象方法
實例方法:
?   實例方法是屬于實例對象的
?   實例方法只能通過實例對象調(diào)用
?   實例方法中的self是實例對象
?   實例方法中可以訪問成員變量
?   實例方法中直接調(diào)用實例方法
?   實例方法中也可以調(diào)用類方法(通過類名)

10、線程和進程的區(qū)別和聯(lián)系娃循?

區(qū)別:
① 進程:一個具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運行活動炕檩。可以理解成一個運行中的應(yīng)用程序捌斧。
② 線程:程序執(zhí)行流的最小單元笛质,線程是進程中的一個實體泉沾。
聯(lián)系:
① 一個進程至少擁有一個線程——即主線程,也可以擁有多個線程妇押。
② 一個線程必須有一個父進程跷究,多個進程可以并發(fā)執(zhí)行。
③ 一個線程可以創(chuàng)建和撤銷另一個線程敲霍。
④ 同一個進程中的多個線程之間可以并發(fā)執(zhí)行揭朝。

11、iOS中的多線程

    iOS中的多線程:是Cocoa框架下的多線程色冀,通過Cocoa的封裝潭袱,可以讓我們更為方便的使用線程,做過
C++的可能會對多線程有更多的理解锋恬,比如:線程的創(chuàng)立屯换,信號量、共享量有認(rèn)識与学,Cocoa框架下會方便很多彤悔,
它對線程做了封裝,有些封裝索守,可以讓我們創(chuàng)建的對象晕窑,本身便擁有線程,也就是線程的對象化抽象卵佛,從而減
少我們的工程杨赤,提供程序的健壯性。
    GCD是(Grand Central Dispatch)的縮寫截汪,從系統(tǒng)級別提供的一個易用地多線程類庫疾牲,具有運行時
的特點,能充分利用多核心硬件衙解。GCD的API接口為C語言的函數(shù)阳柔。函數(shù)參數(shù)中多數(shù)有Block,關(guān)于Block的使
用參看這里蚓峦,為我們提供強大的“接口”舌剂,對于GCD的使用參見本文。
NSOperation與Queue
    NSOperation是一個抽象類暑椰,它封裝了線程的細(xì)節(jié)實現(xiàn)霍转,我們可以通過子類化該對象,機上NSQueue來
同面向?qū)ο蟮乃季S干茉,管理多線程程序谴忧。具體可參看這里:一個機遇NSOperation的多線程網(wǎng)絡(luò)訪問的項目。
NSThread
    NSThread是一個控制線程執(zhí)行的對象,它不如NSOperation抽象沾谓,通過它我們可以方便的得到一個線程委造,
并控制它。但NSThread得線程之間的并發(fā)控制均驶,是需要我們自己來控制的昏兆,可以通過NSCondition實現(xiàn)。
參看
iOS多線程編程之NSThread的使用
定時器與線程的區(qū)別:
?   定時器:可以執(zhí)行多次妇穴,默認(rèn)在主線程中爬虱。
?   線程:只能執(zhí)行一次。

12腾它、串行/并行/同步異步

? 串行/并行

①   串行:一次只能執(zhí)行一個任務(wù)跑筝。
②   并行:并行是一次能執(zhí)行多個任務(wù)。

? 并行/并發(fā)

①   并行是CPU的多核芯同時執(zhí)行多個任務(wù)瞒滴。
②   并發(fā)是單核CPU交替執(zhí)行兩個任務(wù)曲梗。

? 同步異步關(guān)注的是消息通訊機制

①   同步:一個線程要等待上一個線程執(zhí)行完之后才能執(zhí)行當(dāng)前的線程,生活中的例子(上廁所)妓忍。
②   異步:同時去做兩件或者多件事虏两,比如邊聽歌邊看報。

13世剖、多線程編程

?   NSThread:當(dāng)需要進行一些耗時操作時定罢,會把耗時的操作放到線程中。線程同步:多個線程同時訪問一個
數(shù)據(jù)會出問題旁瘫,NSLock祖凫、線程同步塊、@synchronize(self){}境蜕。
?   NSOperationQueue操作隊列(不需要考慮線程同步問題)蝙场。編程的重點都放在main里面凌停,
NSInvocationOperation粱年、BSBLockOPeration、自定義Operation罚拟。創(chuàng)建一個操作綁定相應(yīng)的方法台诗,當(dāng)把
操作添加到操作隊列中時,操作綁定的方法就會自動執(zhí)行了赐俗,當(dāng)把操作添加到操作隊列中時拉队,默認(rèn)會調(diào)用main方
法。
?   GCD(Grand Central Dispatch)宏大的中央調(diào)度阻逮,串行隊列粱快、并發(fā)隊列、主線程隊列;
必須回到主線程刷新UI事哭。

14漫雷、三種多線程的對比

1?? NSThread

每個NSThread對象對應(yīng)一個線程,真正最原始的線程鳍咱。
1)優(yōu)點:NSThread輕量級最低降盹,相對簡單。
2)缺點:手動管理所有的線程活動谤辜,如生命周期蓄坏、線程同步、睡眠等丑念。

2?? NSOperation

自帶線程管理的抽象類涡戳。
1)優(yōu)點:自帶線程周期管理,操作上可更注重自己邏輯脯倚。
2)缺點:面向?qū)ο蟮某橄箢惷帽危荒軐崿F(xiàn)它或者使用它定義好的兩個子類:NSInvocationOperation和
NSBlockOperation。

3?? GCD

Grand Central Dispatch(GCD)是Apple開發(fā)的一個多核編程的解決方法挠将。
1)優(yōu)點:最高效胳岂,避開并發(fā)陷阱。
2)缺點:基于C實現(xiàn)舔稀。

15乳丰、block和weak修飾符的區(qū)別:

①   __block不管是ARC還是MRC模式下都可以使用,可以修飾對象内贮,還可以修飾基本數(shù)據(jù)類型产园。
②   __weak只能在ARC模式下使用,也只能修飾對象(NSString)夜郁,不能修飾基本數(shù)據(jù)類型(int)什燕。
③   __block對象可以在block中被重新賦值,__weak不可以竞端。

16屎即、static關(guān)鍵字的作用

①  函數(shù)體內(nèi)static變量的作用范圍為該函數(shù)體,不同于auto變量事富,該變量的內(nèi)存只被分配一次技俐,因此其值在
下次調(diào)用時仍維持上次的值;
②  在模塊內(nèi)的static全局變量可以被模塊內(nèi)所有函數(shù)訪問统台,但不能被模塊外其他函數(shù)訪問雕擂;
③  在模塊內(nèi)的static函數(shù)只可被這一模塊內(nèi)的其他函數(shù)調(diào)用,這個函數(shù)的使用范圍被限制在聲明它的模塊內(nèi)贱勃;
④  在類中的static成員變量屬于整個類所擁有井赌,對類的所有對象只有一份拷貝谤逼;
⑤  在類中的static成員函數(shù)屬于整個類所擁有,這個函數(shù)不接收this指針仇穗,因而只能訪問類的static成員
變量森缠。

17、簡述類目category優(yōu)點和缺點仪缸。

優(yōu)點:
?   不需要通過增加子類而增加現(xiàn)有類的行為(方法)贵涵,且類目中的方法與原始類方法基本沒有區(qū)別;
?   通過類目可以將龐大一個類的方法進行劃分恰画,從而便于代碼的日后的維護宾茂、更新以及提高代碼的閱讀性;
缺點
?   無法向類目添加實例變量拴还,如果需要添加實例變量跨晴,只能通過定義子類的方式;
?   類目中的方法與原始類以及父類方法相比具有更高優(yōu)先級片林,如果覆蓋父類的方法端盆,可能導(dǎo)致super消息
的斷裂。因此费封,最好不要覆蓋原始類中的方法焕妙。

18、類別(延展)的作用

?   給系統(tǒng)原有類添加方法弓摘,不能擴展屬性焚鹊。如果類別中方法的名字跟系統(tǒng)的方法名一樣,在調(diào)用的時候類別
中的方法優(yōu)先級更高韧献;
?   分散類的實現(xiàn)末患,如:
    +(NSIndexPath *)indexPathForRow:(NSInteger)row inSection:(NSInteger)section
    原本屬于NSIndexPath的方法,但因為這個方法經(jīng)常使用表的時候調(diào)用锤窑、跟表的關(guān)系特別密切璧针,因此把這
個方法以類別的形式、聲明在UITableView.h中渊啰。
?   聲明私有方法探橱,某一個方法只實現(xiàn),不聲明虽抄,相當(dāng)于私有方法走搁。
?   類別不能聲明變量,類別不可以直接添加屬性迈窟。property描述setter方法,就不會報錯忌栅。

19车酣、循環(huán)引用的產(chǎn)生原因曲稼,以及解決方法。

產(chǎn)生原因:
  對象A和對象B相互引用了對方作為自己的成員變量湖员,只有自己銷毀的時候才能將成員變量的引用計數(shù)-1.對象A
的銷毀依賴于對象B的銷毀贫悄,同時對象B銷毀也依賴于對象A的銷毀,從而形成循環(huán)引用娘摔;此時窄坦,即使外界沒有任
何指針訪問它,它也無法釋放凳寺。
解決方法:
?   事先知道存在循環(huán)引用的地方鸭津,在合理的位置主動斷開一個引用,是對象回收肠缨;
?   使用弱引用的方法。

20、代理的作用

?   代理又叫委托陈肛,是一種設(shè)計模式唆鸡,代理是對象與對象之間的通信交互,代理解除了對象之間的耦合性脑慧。
?   改變或傳遞控制鏈魄眉,允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針闷袒「巳冢可以減少
框架復(fù)雜度。
?   另外一點霜运,代理可以理解為Java中的回調(diào)監(jiān)聽機制的一種類似脾歇。
?   代理的屬性常是assign的原因:防止循環(huán)引用,以致對象無法得到正確的釋放淘捡。

21藕各、NSNotification、Block焦除、Delegate和KVO的區(qū)別

?   代理是一種回調(diào)機制激况,且是一對一的關(guān)系,通知是一對多的關(guān)系膘魄,一個對向所有的觀察者提供變更通知乌逐;
?   效率:Delegate比NSNotification高;
?   Delegate和Block一般是一對一的通信创葡;
?   Delegate需要定義協(xié)議方法浙踢,代理對象實現(xiàn)協(xié)議方法,并且需要建立代理關(guān)系才可以實現(xiàn)通信灿渴;
?   Block更加簡潔洛波,不需要定義繁瑣的協(xié)議方法胰舆,但通信事件比較多的話,建議使用Delegate蹬挤。

22缚窿、KVC和KVO

KVC、KVO概述:
①   KVC(NSKeyValueCoding)“鍵—值 編碼”是一種間接訪問對象的屬性的機制焰扳,在OC2.0之后系統(tǒng)提供
了(.)語法來訪問屬性倦零,再此之前我們需要用KVC來訪問。
②   KVO(NSKeyValueObserving)“鍵-值 監(jiān)聽”定義了這樣一種機制吨悍,當(dāng)對象屬性值發(fā)生變化的時候我們
能收到一個通知扫茅。
③   KVC是一種間接訪問對象屬性的機制。
④   KVO是基于KVC來實現(xiàn)的畜份。

23诞帐、謂詞的認(rèn)識

Cocoa框架中提供了一個NSPredicate的類,該類主要用于指定過濾器的條件爆雹,每一個對象通過謂詞進行篩選停蕉,
判斷條件是否匹配。

24钙态、@public慧起、@protected、@private它們的含義與作用

?   @public:對象的實例變量的作用域在任意地方都可以被訪問册倒;
?   @protected:對象的實例變量作用域在本類和子類都可以被訪問蚓挤;
?   @private:實例變量的作用域只能在本類(自身)中訪問。

25驻子、isMemberOfClass和isKindOfClass聯(lián)系與區(qū)別

?   聯(lián)系:兩者都能檢測一個對象是否是某個類的成員灿意。
?   區(qū)別:isKindOfClass不僅用來確定一個對象是否是一個類的成員,也可以用來確定一個對象是否派生自
該類的類的成員崇呵,而isMemberOfClass只能做到第一點缤剧。
?   舉例:如ClassA派生自NSObject類,ClassA *a=[[ClassA alloc]init],
[a isKindOfClass:[NSObject class]]可以檢查出a是否是NSObject派生類的成員域慷,
但isMemberOfClass做不到荒辕。

26、UITableViewCell上有個UILabel犹褒,顯示NSTimer實現(xiàn)的秒表時間抵窒,手指滾動cell過程中,label是否刷叠骑,為什么李皇?

這是否刷新取決于timer加入到Run Loop中的Mode是什么。Mode主要是用來指定事件在運行循環(huán)中的優(yōu)先級座云,
分為:
?   NSDefaultRunLoopMode(kCFRunLoopDefaultMode):默認(rèn)疙赠,空閑狀態(tài)付材;
?   UITrackingRunLoopMode:ScrollView滑動時會切換到該Mode朦拖;
?   UIInitalizationRunLoopMode:run loop啟動時圃阳,會切換到該mode;
?   NSRunLoopCommonModes(kCFRunLoopCommonModes):mode集合璧帝。
蘋果公開提供的Mode有兩個:
?   NSDefaultRunLoopMode(kCFRunLoopDefaultMode)
?   NSRunLoopCommonModes(kCFRunLoopCommonModes)
?   在編程中:如果我們把一個NSTimer對象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)
添加到主運行循環(huán)中的時候捍岳,ScrollView滾動過程中會因為Mode的切換,而導(dǎo)致NSTimer將不再被調(diào)度睬隶。當(dāng)
我們滾動的時候锣夹,也不希望不調(diào)度,那就應(yīng)該使用默認(rèn)模式苏潜。但是银萍,如果希望在滾動時,定時器也要回調(diào)恤左,那就
應(yīng)該使用common mode贴唇。

27、TCP和UDP的區(qū)別與聯(lián)系

?   TCP為傳輸控制協(xié)議飞袋,為面向連接戳气、可靠的、點到點的通信巧鸭;
?   UDP為用戶數(shù)據(jù)報協(xié)議瓶您,非連接的不可靠的點到多點的通信;
?   TCP側(cè)重可靠傳輸纲仍,UDP側(cè)重快速傳輸呀袱。

28、TCP連接的三次握手

?   第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器郑叠,并進入SYN_SEND狀態(tài)夜赵,等待服務(wù)器確認(rèn);
?   第二次握手:服務(wù)器收到syn包锻拘,必須確認(rèn)客戶的SYN(ack=j+1),同時自己也發(fā)送一個SYN包油吭,即
SYN+ACK包,此時服務(wù)器進入SYN+RECV狀態(tài)署拟;
?   第三次握手:客戶端收到服務(wù)器的SYN+ACK包婉宰,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此發(fā)送完畢,
客戶端和服務(wù)器進入ESTABLISHED狀態(tài)推穷,完成三次狀態(tài)心包。

29、ASIHttpRequest馒铃、AFNetWorking之間的區(qū)別

?   ASIHttpRequest功能強大蟹腾,主要是在MRC下實現(xiàn)的痕惋,是對系統(tǒng)CFNetwork API進行了封裝,支持HTTP
協(xié)議的CFHTTP娃殖,配置比較復(fù)雜值戳,并且ASIHttpRequest框架默認(rèn)不會幫你監(jiān)聽網(wǎng)絡(luò)改變,如果需要讓
ASIHttpRequest幫你監(jiān)聽網(wǎng)絡(luò)狀態(tài)改變炉爆,并且手動開始這個功能堕虹。
?   AFNetWorking構(gòu)建于NSURLConnection、NSOperation以及其他熟悉的Foundation技術(shù)之上芬首。擁有
良好的架構(gòu)赴捞,豐富的API及模塊構(gòu)建方式,使用起來非常輕松郁稍。它基于NSOperation封裝的赦政,
AFURLConnectionOperation子類。
?   ASIHttpRequest是直接操作對象ASIHttpRequest耀怜,是一個實現(xiàn)了NSCoding協(xié)議的NSOperation
子類恢着;
AFNetWorking直接操作對象的AFHttpClient,是一個實現(xiàn)NSCoding和NSCopying協(xié)議的NSObject子類封寞。
?   同步請求:ASIHttpRequest直接通過調(diào)用一個startSynchronous方法然评;AFNetWorking默認(rèn)沒有
封裝同步請求,如果開發(fā)者需要使用同步請求狈究,則需要重寫getPath:paraments:success:failures方法碗淌,
對于AFHttpRequestOperation進行同步處理。
?   性能對比:AFNetWorking請求優(yōu)于ASIHttpRequest抖锥;

30亿眠、AFNetWorking大致原理

AFNetWorking是對NSURLConnection和NSURLSession的各自的一層包裝:
①   寫一個單例,開辟新的線程磅废,保證安全性以及開辟一塊內(nèi)存空間纳像;
②   AFN內(nèi)部開了一條專門用來訪問網(wǎng)絡(luò)請求的線程,使用NSThread拯勉;
③   添加一個RunLoop竟趾,保證執(zhí)行網(wǎng)絡(luò)獲取。

31宫峦、如何進行真機調(diào)試

①   首先需要用鑰匙串創(chuàng)建一個鑰匙(key);
②   將鑰匙串上傳到官網(wǎng)岔帽,獲取iOS Development證書;
③   創(chuàng)建APP ID即我們應(yīng)用程序中的Boundle ID导绷;
④   添加Device ID即UDID犀勒;
⑤   通過勾選前面所創(chuàng)建的證書:APP、ID、Device ID贾费;
⑥   生成mobileprovision文件钦购;
⑦   先決條件:申請開發(fā)者賬號99$/299$,從Xcode7開始可以免費真機測試;
⑧   注意:個人版(99$)可以上架AppStore褂萧,企業(yè)版(299$)不可以上架AppStore押桃,通過企業(yè)分發(fā)形式
安裝,將IPA放在七牛云存儲/蒲公英等等箱玷。

32怨规、APP發(fā)布的上架流程

注意:個人版(99$)可以上架AppStore陌宿,企業(yè)版(299$)不可以上架AppStore锡足,通過企業(yè)分發(fā)形式安裝,
將IPA放在七牛云存儲/蒲公英等等壳坪。

①   登錄應(yīng)用發(fā)布網(wǎng)站添加應(yīng)用信息舶得;
②   下載安裝發(fā)布證書;
③   選擇發(fā)布證書爽蝴,使用Archive編譯發(fā)布包沐批,用Xcode將代碼(發(fā)布包)上傳到服務(wù)器;
④   等待審核通過蝎亚;
⑤   生成IPA:菜單欄->Product->Archive九孩。

33、如何進行網(wǎng)絡(luò)消息推送

http://upload-images.jianshu.io/upload_images/326255-1d3791a138d9992b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

APP端需要做的:

①   APP ID(唯一標(biāo)識一個APP程序)发框;
②   Provisioning Profile(APP程序的發(fā)布需要它躺彬,所以推送通知只能在真機上測試);
③   Device Token(設(shè)備標(biāo)識梅惯,這個是推送通知功能中特有的)宪拥。

后臺需要的:

①   SSL Certificate 授權(quán)證書
②   Private Key

推送的所有步驟:

* Provider:應(yīng)用自己的服務(wù)器;
* APNS:Apple Push Notification Service的簡稱铣减,蘋果的PUSH服務(wù)器她君。

①   移動設(shè)備應(yīng)用啟動時注冊消息推送;
②   APNS返回該設(shè)備注冊的唯一設(shè)備標(biāo)示deviceToken葫哗;
③   移動設(shè)備向Provide提供deviceToken缔刹;
④   Provide向APNS發(fā)送<SSL Certificate>和<Private Key>以及需要<推送給設(shè)備的消息>;
⑤   APNS將消息根據(jù)deviceToken推送給指定設(shè)備劣针。

34校镐、SDWebImage內(nèi)部實現(xiàn)流程

SDWebImage:一個異步下載圖片并且支持緩存的UIImageView分類。

①  先從內(nèi)存圖片緩存查找是否有圖片酿秸,如果內(nèi)存中已經(jīng)有圖片緩存灭翔,SDImageCacheDelegate回調(diào)
imageCache:didFindImage:forKey:userInfo:到SDWebImageManager,并展示圖片;
②  如果緩存中沒有肝箱,生成NSInvocationOperation添加到隊列開始從硬盤查找圖片是否已經(jīng)緩存哄褒;
③  根據(jù)URLKey在硬盤緩存目錄下嘗試讀取圖片文件,這一步是在NSOperation進行的操作煌张,所以會主線程
進行回調(diào)notifyDelegate呐赡;
④  如果有圖片就展示;
⑤  如果沒有骏融,共享或重新生成一個下載器SDWebImageDownloader開始下載圖片链嘀;
⑥  connectionDidFinishLoading:數(shù)據(jù)下載完成后交給SDWebImageDecoder做圖片解碼處理;
⑦  圖片解碼處理在一個NSOperationQueue完成档玻,不會拖慢主線程UI怀泊。如果有需要對下載的圖片進行二次
處理,最好也在這里完成误趴,效率會好很多霹琼;
⑧  成功后通知所有的downloadDelegates下載完成,回調(diào)給需要的地方展示圖片凉当;
⑨  將圖片保存到SDImageCache中枣申,內(nèi)存緩存和硬盤緩存同時保存。寫文件到硬盤也可以單獨
NSInvocationOperation完成看杭,避免拖慢主線程忠藤。

35、對NSUserDefaults的理解

NSUserDefaults:系統(tǒng)提供的一種存儲數(shù)據(jù)的方式楼雹,主要用于保存少量的數(shù)據(jù)模孩,默認(rèn)存儲到library下的
Preferences文件夾。

36烘豹、對沙盒的理解

每個iOS應(yīng)用 都被限制在“沙盒”中瓜贾,沙盒相當(dāng)于一個加了僅主人可見權(quán)限的文件夾,即是在應(yīng)用安裝過程中携悯,
系統(tǒng)為每個單獨的應(yīng)用程序生成它的主目錄和一些關(guān)鍵的子目錄祭芦。蘋果對沙盒有幾條限制:
①  應(yīng)用程序在自己的沙盒中運作,但是不能訪問任何其他應(yīng)用程序的沙盒憔鬼;
②  應(yīng)用之間不能共享數(shù)據(jù)龟劲,沙盒里的文件不能被復(fù)制到其他應(yīng)用程序的文件夾中,也不能把其他應(yīng)用文件夾復(fù)制
到沙盒中轴或;
③  蘋果禁止任何讀寫沙盒以外的文件昌跌,禁止應(yīng)用程序?qū)?nèi)容寫到沙盒以外的文件夾中;
④  沙盒目錄里有三個文件夾:
?  Documents——存儲應(yīng)用程序的數(shù)據(jù)文件照雁,存儲用戶數(shù)據(jù)或其他定期備份的信息蚕愤;
?  Library——下有兩個文件夾:Caches——存儲應(yīng)用程序再次啟動所需的信息,Preferences——包含應(yīng)用程
序的偏好設(shè)置文件,不可在這更改偏好設(shè)置萍诱;
?  temp——存放臨時文件即應(yīng)用程序再次啟動不需要的文件悬嗓。
?  獲取沙盒根目錄的方法,有幾種方法:用NSHomeDirectory獲取裕坊。
?  獲取Document路徑:NSSearchPathForDirectoriesInDomains(NSDocumentDirectory包竹,
NSUserDomainMask,YES).

37、堆和棧的區(qū)別:

?   棧區(qū)(stack)由編譯器自動分配釋放籍凝,存放方法(函數(shù))的參數(shù)值周瞎,局部變量的值等,棧是向低地址
擴展的數(shù)據(jù)結(jié)構(gòu)饵蒂,是一塊連續(xù)的內(nèi)存的區(qū)域声诸。即棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的。
?   堆區(qū)(heap)一般由程序員分配釋放苹享,若程序員不釋放双絮,程序結(jié)束時由OS回收,向高地址擴展的數(shù)據(jù)
結(jié)構(gòu)得问,是不連續(xù)的內(nèi)存區(qū)域,從而堆獲得的空間比較靈活软免。
?   碎片問題:對于堆來講宫纬,頻繁的new/delete勢必會造成內(nèi)存空間的不連續(xù),從而造成大量的碎片膏萧,
使程序效率降低漓骚。對于棧來講,則不會存在這個問題榛泛,因為棧是先進后出的隊列蝌蹂,他們是如此的一一對應(yīng),
以至于永遠(yuǎn)都不可能有一個內(nèi)存塊從棧中間彈出曹锨。
?   分配方式:堆都是動態(tài)分配的孤个,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動態(tài)分配沛简。靜態(tài)分配是
編譯器完成的齐鲤,比如局部變量的分配。動態(tài)分配由alloca函數(shù)進行分配椒楣,但是棧的動態(tài)分配和堆是不同的给郊,他的
動態(tài)分配是由編譯器進行釋放,無需我們手工實現(xiàn)捧灰。
?   分配效率:棧是機器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu)淆九,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的
地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高炭庙。堆則是C/C++函數(shù)庫提供的跪另,它的機制是很
復(fù)雜的。
?   全局區(qū)(靜態(tài)區(qū))(static)煤搜,全局變量和靜態(tài)變量的儲存是放在一塊的免绿,初始化的全局變量和靜態(tài)變量
在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域擦盾。程序結(jié)束后由系統(tǒng)釋放嘲驾。
?   文字常量區(qū)——常量字符串就是放在這里的,程序結(jié)束后由系統(tǒng)釋放迹卢。
?   程序代碼區(qū)——存放函數(shù)體的二進制代碼辽故。

38、Struct與Class的區(qū)別:
(http://blog.csdn.net/yuliu0552/article/details/6717915)

共同點:

①   都可以包含成員函數(shù)腐碱;
②   都能繼承誊垢;
③   都能實現(xiàn)多態(tài)。

區(qū)別:

struct是public的症见,class是private的喂走。
①  **struct作為數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)體,它默認(rèn)的數(shù)據(jù)訪問控制是public的谋作;而class作為對象的實現(xiàn)體芋肠,
它默認(rèn)的成員變量訪問控制是private的**。
②  當(dāng)你覺得你要做的更像是一種數(shù)據(jù)結(jié)構(gòu)的話遵蚜,那么用struct帖池;如果你要做的更像是一種對象的話,那么用
class吭净。
③  struct更適合看成是一個數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)體睡汹,class更適合看成是一個對象的實現(xiàn)體。

39寂殉、介紹一下觀察者模式

①  含義:當(dāng)對象間存在一對多關(guān)系時囚巴,則使用觀察者模式(Observer pattern)。比如不撑,當(dāng)一個對象被修改
時文兢,則會自動通知它的依賴對象。觀察者模式屬于行為型模式焕檬。
②  何時使用:一個對象(目標(biāo)對象)的狀態(tài)發(fā)生改變姆坚,所有的依賴對象(觀察著對象)都將得到通知,進行廣播
通知实愚。
③  舉例子:西游記里面悟空請求菩薩降服紅孩兒兼呵,菩薩灑了一地水招來一個老烏龜兔辅,這個烏龜就是觀察者,
他觀察菩薩灑水這個動作击喂。
④  使用場景:
?   有多個子類共有的方法维苔,且邏輯相同。
?   重要的懂昂、復(fù)雜的方法介时,可以考慮作為模板方法。

優(yōu)缺點:

優(yōu)點:①  觀察者和被觀察者是抽象耦合的凌彬。
     ②  建立一套觸發(fā)機制沸柔。
缺點:①  如果一個被觀察者對象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間铲敛。
     ②  如果在觀察者和觀察目標(biāo)之間有循環(huán)依賴的話褐澎,觀察目標(biāo)會觸發(fā)他們之間進行循環(huán)調(diào)用,可能導(dǎo)致系統(tǒng)
崩潰伐蒋。
     ③  觀察者模式?jīng)]有相應(yīng)的機制讓觀察者知道所觀察的目標(biāo)對象是怎么發(fā)生變化的工三,而僅僅只是知道觀察
目標(biāo)發(fā)生了變化。    

iOS觀察者模式:

①   在iOS中觀察者模式的實現(xiàn)有三種方法:Notification先鱼、KVO以及標(biāo)準(zhǔn)方法俭正。
②   標(biāo)準(zhǔn)方法:標(biāo)準(zhǔn)方法的實現(xiàn)是這樣的:Subject(主題)知道所有的觀察者,但是不知道他們的類型型型。
下面我們就從創(chuàng)建Subject和Observer(觀察者)的協(xié)議(protocol)開始段审。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市闹蒜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抑淫,老刑警劉巖绷落,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異始苇,居然都是意外死亡砌烁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門催式,熙熙樓的掌柜王于貴愁眉苦臉地迎上來函喉,“玉大人,你說我怎么就攤上這事荣月」芎牵” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵哺窄,是天一觀的道長捐下。 經(jīng)常有香客問我账锹,道長,這世上最難降的妖魔是什么坷襟? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任奸柬,我火速辦了婚禮,結(jié)果婚禮上婴程,老公的妹妹穿的比我還像新娘廓奕。我一直安慰自己,他們只是感情好档叔,可當(dāng)我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布桌粉。 她就那樣靜靜地躺著,像睡著了一般蹲蒲。 火紅的嫁衣襯著肌膚如雪番甩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天届搁,我揣著相機與錄音缘薛,去河邊找鬼。 笑死卡睦,一個胖子當(dāng)著我的面吹牛宴胧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播表锻,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼恕齐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瞬逊?” 一聲冷哼從身側(cè)響起显歧,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎确镊,沒想到半個月后士骤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蕾域,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年拷肌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旨巷。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡巨缘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出采呐,到底是詐尸還是另有隱情若锁,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布懈万,位于F島的核電站拴清,受9級特大地震影響靶病,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜口予,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一娄周、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沪停,春花似錦煤辨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舷礼,卻和暖如春鹃彻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妻献。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工蛛株, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人育拨。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓谨履,卻偏偏與公主長得像,于是被迫代替她去往敵國和親熬丧。 傳聞我的和親對象是個殘疾皇子笋粟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容