面試題精華

1、以下代碼有什么問題嗎爆安?如果沒有問題的話叛复,obj、obj2的引用計數(shù)分別是多少扔仓?如果有問題的話存在什么問題褐奥?
 Class *obj = [[Class alloc]init];
 Class *obj2 = obj;
    [obj hello];
 [obj release];
 [obj2 hello];
   [obj2 release];

答:上面的代碼是存在問題的。當執(zhí)行完第一行代碼時翘簇,因為執(zhí)行了alloc撬码,obj的引用計數(shù)為1。第二行代碼執(zhí)行完之后版保,obj2只是和obj指向了同一塊內(nèi)存呜笑。第三行代碼是執(zhí)行了hello方法夫否。第四行代碼執(zhí)行release消息之后,obj的引用計數(shù)減一叫胁,這時retainCount變?yōu)?.系統(tǒng)自動調(diào)用dealloc方法凰慈,對象被銷毀。第五行代碼執(zhí)行時驼鹅,obj2執(zhí)行的內(nèi)存已經(jīng)被系統(tǒng)回收了微谓,但還是調(diào)用了hello方法,出現(xiàn)了問題(野指針)输钩。第六行執(zhí)行時豺型,obj2所指向的內(nèi)存已經(jīng)不存在,再次調(diào)用release消息买乃,出現(xiàn)過度釋放的問題姻氨,而且obj2已經(jīng)變成野指針了。
Class *obj = [[Class alloc]init];//obj引用計數(shù)加1
Class *obj2 = obj;//obj为牍,obj2指向同一塊內(nèi)存(對象)
[obj hello];
[obj release];//obj指向的內(nèi)存(對象)被銷毀
[obj2 hello];//錯誤,obj2指向的內(nèi)存(對象)已經(jīng)被銷毀了
[obj2 release];//[obj release]之后,obj2是個野指針,不應(yīng)該再去調(diào)用方法.

2哼绑、在實際開發(fā)的過程中岩馍,什么情況下需要創(chuàng)建自動釋放池碉咆?下面代碼中有沒有什么問題?
  Person *p1=[[Person alloc]init];
  @autoreleasepool {
  [p1 autorelease];
    @autoreleasepool {
      [p1 autorelease];
   }
 }

答:其實自動釋放池存在的意義是為了延遲釋放一些對象蛀恩,延遲向?qū)ο蟀l(fā)送release消息疫铜。在實際的開發(fā)中呢,有兩種情況是需要手動創(chuàng)建自動釋放池的双谆。第一個就是在多線程中壳咕,因為子線程中可能會使用便利構(gòu)造器等方法來創(chuàng)建對象,那么這些對象的釋放只能放在自動釋放池中顽馋,主線程其實已經(jīng)添加過自動釋放池谓厘,在main函數(shù)里面。第二個就是如果一段代碼里面(比如for循環(huán))大量使用便利構(gòu)造器創(chuàng)建對象寸谜,也需要手動添加自動釋放池竟稳。
上述代碼其實是存在問題的。當執(zhí)行完第一行代碼時熊痴,p1的引用計數(shù)是1.第二行是創(chuàng)建了一個autoreleasepool他爸。第三行代碼向p1發(fā)送了autorelease消息,延遲release果善,即在出池的時候诊笤,把p1釋放掉。第四行代碼又創(chuàng)建了一個autoreleasepool巾陕。第五行代碼再次向p1發(fā)送了autorelease消息讨跟。當代碼執(zhí)行到第六行的“}”時纪他,第二個自動釋放池結(jié)束,這時p1引用技術(shù)減1许赃,p1所指向的內(nèi)存(對象)的retainCount由1變?yōu)?止喷,內(nèi)存被系統(tǒng)回收。代碼執(zhí)行到第七行時混聊,最外層的自動釋放池結(jié)束弹谁,再次向p1發(fā)送release消息,出現(xiàn)過度釋放句喜。
@autoreleasepool {
[p1 autorelease];//此時p1被加入自動釋放池1
@autoreleasepool {
[p1 autorelease];//此時p1被加入自動釋放池2
}//此處预愤,自動釋放池2結(jié)束,p1引用計數(shù)-1
}//此處咳胃,自動釋放池1結(jié)束植康,但是向已經(jīng)被釋放的對象p1發(fā)送了消息

3、ARC下dealloc方法存在的意義在于什么地方展懈?舉例說明一下具體的使用場景销睁。

答:dealloc 在ARC下的作用就是釋放系統(tǒng)無法釋放的該對象占用的資源,或者其他對象對該對象的引用(釋放代理)
其實在MRC中dealloc方法存在的主要意義是為了釋放自身的實例變量存崖,移除觀察者冻记,停止timer,移除通知来惧,代理置空等冗栗。ARC下,系統(tǒng)會幫助我們釋放該對象所包含的實例變量供搀,但是有些對象還是需要們自己去釋放的(比如Core Foundation框架下的一些對象)隅居,另外通知中觀察者的移除,代理置空葛虐,停止timer等
示例如下所示:

- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];//移除通知觀察者
[[XMPPManager sharedManager] removeFromDelegateQueue:self];//移除委托引用
[[MyClass shareInstance]  doSomething ]//其他操作
scrollView.delegate = nil;
[timer invalidate];
}
4胎源、分別寫出MRC中在assign、retain屿脐、copy下屬性name對應(yīng)的setter方法的內(nèi)部實現(xiàn)涕蚤。

答:

  • assign下
- (void) setName:(NSString*)name
{
  _name = name;
}
  • retain下
     if(_name != name){
     [_name release];
    _name = [name retain];
    }
}
  • copy下
     if(_name != name){
    [_name release];
    _name = [name copy];
    }
}
5、在Category中本身不允許為已有的類添加新的屬性或者成員變量摄悯,你有沒有其他的方法可以在category中添加屬性或者是成員變量赞季?

答:一種方法就是使用runtime.h中的objc_getAssociatedObject和objc_setAssociatedObject來訪問和生成關(guān)聯(lián)對象。例如為NSObject添加一個類目奢驯,分類中添加一個屬性申钩。代碼如下所示:

  • NSObject+Test.h文件
\#import <Foundation/Foundation.h>
@interface NSObject (Test)
@property (nonatomic, strong) NSString *test;
@end
  • NSObject+Test.m文件
#import “NSObject+Test.h"
#import <objc/runtime.h>
static const void *instanceNameKey = &instanceNameKey;
@implementation NSObject (Test)
@dynamic test;
-(NSString *)test
{
    return objc_getAssociatedObject(self, instanceNameKey);
}
-(void)setTest:(NSString *)test
{
    objc_setAssociatedObject(self, instanceNameKey, test, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
6、@synthesize和@dynamic有什么區(qū)別瘪阁?
  • (1)@property有兩個對應(yīng)的詞撒遣,一個是@synthesize邮偎,一個是@dynamic。如果@synthesize和@dynamic都沒寫义黎,那么默認的就是@syntheszie var = _var;
  • (2)@synthesize的語義是如果你沒有手動實現(xiàn)setter方法和getter方法禾进,那么編譯器會自動為你加上這兩個方法。
  • (3)@dynamic告訴編譯器:屬性的setter與getter方法由用戶自己實現(xiàn)廉涕,不自動生成泻云。(當然對于readonly的屬性只需提供getter即可)。假如一個屬性被聲明為@dynamic var狐蜕,然后你沒有提供@setter方法和@getter方法宠纯,編譯的時候沒問題,但是當程序運行到instance.var = someVar层释,由于缺setter方法會導(dǎo)致程序崩潰婆瓜;或者當運行到 someVar = instance.var時,由于缺getter方法同樣會導(dǎo)致崩潰贡羔。編譯時沒問題廉白,運行時才執(zhí)行相應(yīng)的方法,這就是所謂的動態(tài)綁定乖寒。@dynamic可用于在分類中添加屬性(需要用到objc_getAssociatedObject和objc_setAssociatedObject函數(shù))猴蹂。
7、你如何看待iOS中的拷貝宵统?

答:在我看來晕讲,日常生活中覆获,當我們用到”拷貝”這個詞語的時候马澈,不管怎樣都會產(chǎn)生兩份府适。一份是原來的祟绊,一份是新拷貝出來的纪蜒。但是到目前為止舔稀,在iOS中我看到了三種拷貝方式:

  • (1)偽拷貝:偽拷貝菩佑,顧名思義屠升,就是假拷貝谒所,沒有拷貝出新的對象徙菠。這一點對于NSString這種類簇來說比較常見缨称,NSString本身是不可變字符串凝果,內(nèi)容不可能被修改,因此我們也沒有拷貝的必要睦尽,因為拷貝的目的是防止原件被修改器净,所以才拷貝出來一份,偽拷貝實際上是對象引用計數(shù)加了1(相當于retain或者strong的功效)当凡。
  • (2)淺拷貝:淺拷貝就是確實拷貝出來一份和原來內(nèi)容一樣的新對象山害。但是對于對象自帶的屬性是偽拷貝纠俭,兩個對象的屬性指向同一個內(nèi)存。
  • (3)深拷貝:深拷貝就是不僅僅拷貝出一份新對象浪慌,而且對象的屬性也拷貝了一份冤荆。
    總的來說,如果在開發(fā)的過程中需要實現(xiàn)拷貝权纤,那么需要接受NSCopying協(xié)議钓简。實現(xiàn)copyWithZone:方法。淺拷貝汹想、深拷貝的區(qū)別在于copyWithZone:方法的實現(xiàn)不同涌庭。
8、父類實現(xiàn)深拷貝時欧宜,子類如何實現(xiàn)深拷貝 坐榆?父類沒有實現(xiàn)深拷貝時,子類如何實現(xiàn)深度拷貝冗茸?

答:父類實現(xiàn)深拷貝之后席镀,子類在重寫的copyWithZone方法,先調(diào)用父類的copyWithZone方法夏漱,之后實現(xiàn)自己屬性的拷貝豪诲。
如果父類沒有實現(xiàn)深拷貝,子類除了需要對自己的屬性進行拷貝挂绰,還要對父類的屬性進行拷貝屎篱。

9、系統(tǒng)中有哪些單例類葵蒂?在真實的開發(fā)中交播,單例的應(yīng)用場景在于什么地方?

答:系統(tǒng)為我們提供了很多單例類践付。例如:UIScreen秦士、UIDevice、NSFileManager永高、NSNotificationCenter隧土,NSUserDefaults,UIApplication等等命爬。而且在實際的開發(fā)中除了使用系統(tǒng)給我們提供的單例類之外曹傀,還會根據(jù)需求自己創(chuàng)建單例類。例如:1.數(shù)據(jù)庫處理饲宛。對于數(shù)據(jù)的增刪改查皆愉,可能在很多界面都會用到,那這個時候,可以定義一個針對數(shù)據(jù)處理的單例類亥啦。2.音樂播放炭剪。在做音樂播放類項目時,一般會在多個頁面都可以播放音樂翔脱,這時也可以講播放器定義為單例類奴拦,在多個界面使用。3.下載管理届吁,當下載音樂或者視頻時错妖,應(yīng)該定義一個單例類管理下載任務(wù)。4.登錄類程序里面疚沐,還可以定義單例類保存用戶資料暂氯,狀態(tài)等。

10亮蛔、寫出在多線程情況下的一個單例痴施。

答:一般情況下,在開發(fā)中我們所寫的單例都是偽單例究流。即只是保證了在調(diào)用某一方法時辣吃,所產(chǎn)生的對象只有一個,但是沒有考慮其他的影響其引用計數(shù)的方法芬探。例如retain神得、copy等。為了保證線程安全偷仿,單例的寫法如下所示:
方法一:

static AccountManager *sharedAccountManagerInstance = nil;
+ (AccountManager *)sharedManager{
@synchronized (self){
if (sharedAccountManagerInstance == nil) {
sharedAccountManagerInstance = [[AccountManager alloc] init];
}
}
return sharedAccountManagerInstance;
}```
方法二:

static AccountManager *sharedAccountManagerInstance = nil;

  • (AccountManager *)sharedManager
    {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    sharedAccountManagerInstance = [[AccountManager alloc] init];
    });
    return sharedAccountManagerInstance;
    }

#####11哩簿、寫一個標準的宏,這個宏輸入兩個參數(shù)并且返回較小的一個酝静。
>答:#define Min(X,Y) ((X) < (Y) ?(X):(Y))

#####12节榜、應(yīng)用程序在啟動的時候主要做了什么操作?
>答:應(yīng)用程序在啟動的時候形入,會執(zhí)行main函數(shù)全跨,而main函數(shù)里面主要執(zhí)行了UIApplicationMain函數(shù)缝左。UIApplicationMain函數(shù)執(zhí)行完主要做了以下三個操作:
> * (1)創(chuàng)建應(yīng)用程序UIApplication對象亿遂。
> * (2)創(chuàng)建了應(yīng)用程序代理對象。默認的應(yīng)用程序代理對象是AppDelegate渺杉。
> * (3)建立一個事件循環(huán)RunLoop蛇数。用來實時監(jiān)測應(yīng)用程序中的各種事件(觸摸,晃動是越,遠程控制事件耳舅,通知,觀察者,timer等等)浦徊。

#####13馏予、簡述應(yīng)用程序按Home鍵進入后臺時的生命周期,以及從后臺回到前臺時的生命周期盔性。
>答:正在運行的程序霞丧,點擊了Home鍵之后,應(yīng)用程序會由活躍狀態(tài)變?yōu)榉腔钴S狀態(tài)冕香,之后應(yīng)用程序進入后臺蛹尝。在這個過程中執(zhí)行的方法分別是applicationWillResignActive:和applicationDidEnterBackground:。
       當應(yīng)用程序從后臺回到前臺時悉尾,應(yīng)用程序會先進入前端突那,然后由非活躍狀態(tài)變?yōu)榛钴S狀態(tài)。在這個過程中執(zhí)行的方法分別是:
applicationWillEnterForeground:和applicationDidBecomeActive:

#####14构眯、ViewController 的 alloc愕难,loadView,viewDidLoad惫霸,dealloc在自定義ViewController中這幾個函數(shù)里面應(yīng)該做什么工作务漩?
>答:   alloc方法一般情況下會直接調(diào)用,主要是為了開辟內(nèi)存空間它褪,創(chuàng)建對象饵骨。
重寫loadView方法的主要目的是使用自己創(chuàng)建的view(一般會定義一個UIView子類,用子類創(chuàng)建對象茫打,子類中已經(jīng)添加好對應(yīng)的控件了)作為ViewController的View居触,而不是直接使用系統(tǒng)自帶的View。loadView方法和我們在storyboard或XIB中拖控件是等價的老赤。
viewDidLoad方法一般情況下會給添加好的控件賦值(比如頁面?zhèn)髦禃r轮洋,列表頁面會把model傳遞給detail頁面,在detail頁面的viewDidLoad中使用model中的數(shù)據(jù)給控件賦值)抬旺,開啟timer弊予,網(wǎng)絡(luò)請求等。
dealloc方法在執(zhí)行的時候开财,主要是釋放控制器的實例變量或者是將delegate置空汉柒、移除觀察者,停止timer等责鳍。

#####15碾褂、請描述一下viewController幾個重要方法的執(zhí)行時機
>答:視圖控制器的生命周期分為創(chuàng)建、 顯示 和 銷毀历葛。
######(1)創(chuàng)建
xxx *x = [[xxx  alloc] init]  // 作用:分配內(nèi)存空間正塌,創(chuàng)建控制器時使用
######(2)加載和顯示:
* -(void)loadView: // 作用:加載根視圖(即為self.view賦值)  ,在控制器view屬性的getter方法首次調(diào)用的時候執(zhí)行此方法。
根視圖已加載:
* -(void)viewDidLoad// loadView執(zhí)行完畢之后乓诽,立即執(zhí)行此方法帜羊。作用:給創(chuàng)建好的控件設(shè)置值,做網(wǎng)絡(luò)請求鸠天,開啟timer等
loadView 和 viewDidLoad 當首次訪問controller的根視圖時才會執(zhí)行逮壁,即view屬性的getter方法首次使用時執(zhí)行, loadView 執(zhí)行在前粮宛, viewDidLoad執(zhí)行在后窥淆。如果重寫了 loadView 一定要給控制器的根視圖賦值(self.view = xxView;),在給控制器的根視圖賦值的之前巍杈,不能使用控制器view屬性的getter方法忧饭,否則會重復(fù)執(zhí)行 loadView 和 viewDidLoad 方法。視圖將要顯示:
* -(void)viewWillAppear:
視圖將要被添加到 UI 層級上筷畦,還沒有添加時執(zhí)行词裤。(此時視圖還沒有顯示)視圖已經(jīng)顯示:
* -(void)viewDidAppear
視圖已經(jīng)被添加到 UI 層級上,視圖已經(jīng)顯示出來時執(zhí)行鳖宾。(視圖已經(jīng)顯示)
視圖將要消失:
- (void)viewWillDisappear:
視圖將要被從 UI 層級上面移除吼砂,但視圖還沒有移除時執(zhí)行。 (視圖還可見)
視圖已經(jīng)消失:
- (void)viewDidDisappear:
視圖已經(jīng)從 UI 層級上面移除鼎文,視圖已經(jīng)不可見時執(zhí)行渔肩。 (視圖不可見)
######(3)銷毀:
- (void)viewWillUnload
iOS6.0之后已經(jīng)被棄用。iOS 5.0 之前拇惋,當?shù)蛢?nèi)存且控制器的view不需要使用的時候會調(diào)用這個方法周偎,即當控制器的根視圖 將要 被釋放時執(zhí)行([vc.view release],vc.view還未置空)撑帖,我們可以在這個方法中移除一些跟視圖相關(guān)的觀察者和通知蓉坎,并記錄視圖的狀態(tài),以便之后重新創(chuàng)建視圖胡嘿。 iOS6.0 之后不再需要做釋放了蛉艾,該方法也被遺棄了。
- (void)viewDidUnload
iOS6.0 之后已經(jīng)被棄用衷敌。iOS 5.0 之前勿侯,當?shù)蛢?nèi)存且控制器的view不需要使用的時候會調(diào)用這個方法,即當控制器的根視圖被釋放時執(zhí)行([vc.view release]逢享,vc.view已經(jīng)為nil)罐监,這個方法給我們一個機會做內(nèi)存的相關(guān)清理工作,如果控制器對某些視圖有引用瞒爬,可以在這里釋放這些引用,同樣可以釋放一些懶加載的對象,但是不要釋放那些不容易重新加載的數(shù)據(jù)侧但。 iOS6.0 之后不再需要做釋放了矢空,該方法也被遺棄了。

#####16.在使用系統(tǒng)的一些類例如UITableView時禀横,會發(fā)現(xiàn)其delegate屬性的語義設(shè)置為assign而不是retain屁药,為什么呢?
>答:``delegate`` 的語義修飾符 為``assign`` 不是 ``retain`` 主要是為了避免兩個對象因相互引用造成的內(nèi)存泄露問題柏锄。
因為 `` retain``修飾``delegate``酿箭,當通過set方法賦值時,對象的引用計數(shù)會+1.
如果此時兩個對象具有如下關(guān)系:A對象有一個屬性是B趾娃,B的``delegate``是A缭嫡。即互相為彼此的屬性。例如: A 是``viewController`` 抬闷,B是``tableView``.  B 是A的屬性妇蛀,B的引用計數(shù)會+1,B的``delegate``是A笤成,A 的引用計數(shù)也會 +1. 那么如果A沒有釋放评架,B就一直不會釋放,因為A對B有擁有權(quán)炕泳。 同理纵诞,B沒有釋放,A也一直釋放不掉培遵,因為B對A也有擁有權(quán)挣磨。 因此A 和 B 的``dealloc`` 都會不執(zhí)行,造成內(nèi)存泄露.
代碼演示如下(只寫出了核心代碼):

A *a = [[A alloc] init] // a 引用計數(shù):1
B *b = [[B alloc] init] // b 引用計數(shù):1
a.b = b; // b 引用計數(shù): 2
b.delegate = a; // a 引用計數(shù): 2
[a release]; // a引用計數(shù): 1
[b release]; // b引用計數(shù): 1
// 最終 A 和 B 都釋放不掉荤懂。
assign則是直接賦值茁裙,并不會引起引用計數(shù)增加,因此使用assign 不會出現(xiàn)內(nèi)存泄露节仿。
代碼演示如下(只寫出了核心代碼):
A *a = [[A alloc] init] // a 引用計數(shù):1
B *b = [[B alloc] init] // b 引用計數(shù):1
a.b = b; // b 引用計數(shù): 2
b.delegate = a; // a 引用計數(shù): 1
[a release]; // a引用計數(shù): 0晤锥, b引用計數(shù):1(在a的dealloc里面_b被釋放了)
[b release]; // b引用計數(shù): 0
// 最終 A 和 B 都可以釋放掉。


######17.UIImage初始化一張圖片的方法以及優(yōu)缺點
>答:
> * ``
UIImage *image = [UIImage imageNamed:@”1.png”];
``
這個方法創(chuàng)建的圖片是從緩存?面獲取的, 先在緩存?面查,看是不是有這個圖?, 沒有的話將圖?添加進緩存再使用. 有的話直接使用緩存?面的. 在程序中廊宪,如果這張圖?要在多個地方使用的話, 建議使用這種?式. 缺點是一旦加入緩存矾瘾,就一直占用內(nèi)存,不能被釋放掉箭启。
> * 讀取本地圖?路徑

NSString *imagePath=[NSString stringWithFormat:@"%@/Documents/
%@.jpg",NSHomeDirectory(),@"test"];
[UIImage imageWithContentsOfFile:imagePath];

從?機本地讀取, 比較第一種方式, 這個是直接加載圖片的壕翩,圖片不需要的時候,可以release掉. 所以建議在使用重復(fù)率低的圖片時使用這個方法.
> * 以下這種方式會卡線程傅寡,建議代碼放到子線程里面放妈。

imageWithData: data可以通過data創(chuàng)建圖片(data可以來自網(wǎng)絡(luò)也可
以來自本地)
NSURL *url = [NSURL URLWithString:@“http://e.picphotos.baidu.com/album/s%3D550%3Bq%3D90%3Bc%3Dxiangce%2C100%2C100/sign=f51d2708cb11728b342d8c27f8c7b2f3/bba1cd11728b47109d0f5555c5cec3fdfc032302.jpg?referer=f55e30e2d71373f0ac285aaf8d00&x=.jpg"];
UIImage *image2 = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];

需要注意的是北救,如果imageWithData是同步網(wǎng)絡(luò)請求,如果在主線程中直接使用芜抒,會卡主線程珍策,因此一般不會在主線程中直接使用,而是采用異步網(wǎng)絡(luò)請求獲取data賦值宅倒。

######18.當手指點擊屏幕上的登錄按鈕時攘宙,響應(yīng)者鏈的檢測過程是什么樣子的?
>答:當手指觸摸到屏幕上的登錄按鈕時拐迁,首先``runloop``會檢測到事件蹭劈,將事件傳遞給``UIApplication``對象,``UIApplication``對象將事件傳遞給``AppDelegate``對象线召,之后``AppDelegate``對象將事件傳遞給``window``對象铺韧,然后傳遞給``rootViewController``,之后是``view``,之后檢測``View``上的子視圖,通過比對觸摸的位置定位到對應(yīng)的``Button``灶搜。

#####19.在一個imageView上添加Button祟蚀,給Button添加一個事件,點擊Button時能否響應(yīng)事件割卖?如果不能前酿,用響應(yīng)者鏈解釋一下為什么不可以?
>答:不能鹏溯。因為imageView的用戶交互默認是關(guān)閉的罢维。imageView的用戶交互關(guān)閉,阻斷了響應(yīng)者鏈的檢測過程丙挽,所以在檢測的過程中肺孵,就直接不檢測imageView以及它上面的其他控件,也就檢測不到button的存在颜阐。因為響應(yīng)的過程正好是和檢測的過程相反平窘,因為檢測不到button被觸摸,所以button的點擊事件也不會響應(yīng)凳怨。解決辦法就是把imageView的用戶交互打開瑰艘。

#####20.列舉一下常用的第三方框架
>答:我在做開發(fā)的過程中曾經(jīng)用過以下第三方框架:
(1)AFNetworking  網(wǎng)絡(luò)請求庫
(2)SDWebImage  網(wǎng)絡(luò)圖片加載
(3)FMDB  數(shù)據(jù)庫
(4)Masonry  自動布局
(5)UmengSDK/Share SDK 分享
(6)融云/環(huán)信  即時通信
(7)ZBar/ZXing  二維碼掃描和生成
(8)MBProgressHUD  風(fēng)火輪
(9)GTMBase64  base64編碼解碼
(10)MJRefresh   下拉刷新,上拉加載
(11)百度/高德地圖SDK

#####21.MJRefresh 原理
>答:給``UISCrollView``添加了分類肤舞,在分類中紫新,根據(jù)``scrollView``的``contentOffset``進行判斷方向和偏移量,當偏移量到某一個臨界值的時候李剖,開始切換``header``或者``footer``的狀態(tài)芒率,以呈現(xiàn)不同的``UI``,當偏移量大于臨界值并松開手的時候, 執(zhí)行``block``回調(diào)或者``target..action``的方法, 主要在``block``或者``target..action``中進行網(wǎng)絡(luò)請求篙顺,請求結(jié)束后偶芍,調(diào)用``endRefresh``方法充择,再次更改``header``或者``footer``的狀態(tài),使他們回到初始狀態(tài)腋寨。

#####22.block在定義成屬性時應(yīng)該用什么關(guān)鍵字聪铺,為什么化焕?
>答:block在定義成屬性時關(guān)鍵字應(yīng)該使用copy萄窜。我們平時使用的block,主要是存放在棧區(qū)的(有的是在全局區(qū))撒桨,棧區(qū)的block出了作用域就會被釋放查刻,當我們進行block回調(diào)的時候,block已經(jīng)被系統(tǒng)給銷毀了凤类,會出現(xiàn)crash穗泵。為了管理和使用block,需要將其拷貝到堆區(qū)谜疤。全局區(qū)的block理論上是不用拷貝的佃延,但拷貝也沒什么壞處,不用的時候夷磕,我們也會對copy的對象進行釋放履肃,不會造成內(nèi)存泄露。因為block在棧區(qū)的情況比較多坐桩,為了書寫方便尺棋,保持格統(tǒng)一,我們把block定義成屬性時绵跷,使用copy關(guān)鍵字膘螟。

#####23.定義一個返回值為字符串類型,參數(shù)是int類型的Block碾局。并且調(diào)用該Block荆残。
>答:Block定義如下所示:

NSString * (^block)(int a) = ^ NSString * (int a){
return [NSString stringWithFormat:“%d”,a];
};

Block調(diào)用:

NSString *str = block(10);


#####24. 請談?wù)勀銓lock和delegate模式認識净当?
>答:無論是block還是delegate模式本質(zhì)上都是回調(diào)内斯,使用block,其優(yōu)點是回調(diào)的block代碼塊直接就放在了block賦值的地方蚯瞧,使代碼更為緊湊嘿期,缺點是block內(nèi)使用到當前類的實例變量的時候,需要注意循環(huán)引用的問題埋合,即需要使用__block(MRC下)或者__weak(ARC下)定義一個弱引用的self出來备徐,block里面使用弱引用的self去操作屬性或調(diào)用方法。delegate模式不用像block一樣做特殊處理甚颂,但是如果多個對象設(shè)置的代理是同一個對象蜜猾,就需要在delegate方法中判斷當前執(zhí)行代理的是哪個對象秀菱。

#####25.什么是沙盒?
>答:所謂的沙盒其實是操作系統(tǒng)為應(yīng)用程序分配的一個密閉文件夾蹭睡。應(yīng)用程序擁有這個文件夾內(nèi)文件的訪問權(quán)限衍菱,且只能對這個文件夾內(nèi)的文件進行操作(當然也可以訪問系統(tǒng)提供的文件,比如:相冊)肩豁,不可以去訪問其他應(yīng)用程序的文件夾脊串。

#####26.在沙盒中有幾個文件夾?
>答:沙盒含有3個文件夾:Documents, Library 和 tmp
> * Documents:蘋果建議將程序中建立的或在程序中瀏覽到的文件數(shù)據(jù)保存在該目錄下清钥,iTunes備份和恢復(fù)的時候會包括此目錄琼锋。
> * Library:存儲程序的默認設(shè)置或其它狀態(tài)信息。
iTunes在與iPhone同步時祟昭,備份所有的Documents和Library文件缕坎。
Library/Caches:存放緩存文件,一般是下載的圖片和視頻篡悟,iTunes不會備份此目錄谜叹,此目錄下文件不會在應(yīng)用退出刪除。
> * tmp:臨時文件夾搬葬,應(yīng)用程序在重啟時荷腊,會丟棄所有的tmp文件。

#####27.你熟悉的設(shè)計模式有哪些踩萎,請說說對他們的理解停局。
>答:單例,通知香府,KVO董栽,代理,target-action等
> * 單例企孩,主要特點是一個類只有一個對象锭碳。對外提供了一個獲取唯一對象的方法,一般都是類方法勿璃,完整的單例會重寫很多引用計數(shù)相關(guān)的方法(比如:allocWithZone擒抛,copyWithZone,retain补疑,release歧沪,autorelease,retainCount等)以保證對象在任何情況下都唯一莲组。單例最大的價值就是建立程序級別的全局變量诊胞,就是把不同模塊都要用的變量以屬性的形式放到單例里面,以便隨時使用锹杈。音頻播放類程序一般會寫單例來管理需要播放的音樂信息撵孤,需要下載的地方也會以單例的形式來管理下載對象迈着。
> * 通知,是M與C通信的方式之一邪码。一般是Model發(fā)送變化的時候裕菠,會發(fā)送通知告訴Controller,Controller再做相應(yīng)的處理闭专。需要先往通知中心里面注冊觀察者奴潘,然后在合適的時機,通知中心post通知喻圃,觀察者做對應(yīng)的處理萤彩,當觀察者將要釋放的時候粪滤,從通知中心移除觀察者斧拍。
> * KVO,也是M與C通訊的方式杖小。一般是C去觀察M的某個屬性肆汹,某個屬性發(fā)生變化之后,C做出相應(yīng)的處理予权,當C將要釋放的時候昂勉,M移除觀察者。
> * 代理扫腺,是V與C通信的方式之一岗照。一般C是V的代理,V發(fā)生變化的時候笆环,C做對應(yīng)的調(diào)整攒至。例如:UITableView被點擊了,由Controller做處理躁劣。我們在自己寫代理的時候迫吐,一定要清楚誰來處理事件,誰來調(diào)用代理方法账忘。通常情況下都是C處理時間志膀,V在適當?shù)臅r候調(diào)用代理方法。
> * target-action鳖擒,也是V與C通信的方式之一溉浙。一般C是V的target,V被點擊或者被滑動之后蒋荚,C做出對應(yīng)的處理戳稽。無論是target-action還是代理,核心都是回調(diào)圆裕。

#####28.NSNotification和KVO的區(qū)別和用法是什么?什么時候應(yīng)該使用通知,什么時候應(yīng)該使用KVO,它們的實現(xiàn)上有什么區(qū)別?
>答:
> * 通知和KVO都是觀察者模式的體現(xiàn)广鳍,二者側(cè)重點有些不同荆几。
通知往往用于1對多的場景,多個觀察者觀察一個通知赊时,一旦這個通知被通知中心post吨铸,所有觀察者都可以做出響應(yīng)。具體的實現(xiàn)流程是:(1)通知中心通過addObserver方法添加觀察者祖秒,其實是把觀察者和通知進行綁定诞吱,多次使用addObserver方法可以為同一個通知添加多個觀察者。
(2)通知中心發(fā)送通知竭缝。
(3)各個觀察者做各自的處理房维。
(4)在觀察者銷毀之前(dealloc中),從通知中心移除觀察者抬纸。
> * KVO多用于1對1的場景咙俩,一個對象去觀察另外一個對象的屬性值有沒有發(fā)生變化,一旦發(fā)生變化湿故,觀察者做出響應(yīng)阿趁。具體的流程是:
(1)被觀察者添加觀察者,指定觀察者觀察的屬性坛猪。
(2)被觀察者的屬性在某一時間發(fā)生了變化脖阵。
(3)觀察者做出響應(yīng)。
(4)在觀察者銷毀之前墅茉,先移除觀察者欢际。
KVO其實也可以1對多觅玻,就是多個觀察者觀察同一個對象同一個屬性的變化喷斋。KVO和通知給人的感覺一個主動通知(通知會由通知中心主動post)庸推,一個是被動通知(KVO,觀察者一直盯著屬性變沒變战转,一旦變化搜立,自己就做出響應(yīng)。被觀察的對象不是主動告知你我變了)槐秧。

#####29.定義屬性時啄踊,什么情況使用copy,assign刁标,和retain颠通?
>答:
> * assign用于簡單數(shù)據(jù)類型,如NSInteger,double,bool膀懈。retain 和copy用于對象類型顿锰,二者又有區(qū)別,
> * copy是用于一個對象有可能被修改,但不想修改原件硼控,所以拷貝一份出來(新拷貝的對象引用計數(shù)為1)刘陶,這樣新拷貝的修改了,原件不會變牢撼,原件修改了匙隔,新拷貝的不會變。
> * 而retain呢熏版,對象引用計數(shù)+1纷责,對象只有一個,但引用計數(shù)為2撼短,通過任何一個引用修改對象內(nèi)容再膳,另外一個引用使用的時候,用的就是修改之后的內(nèi)容曲横。

#####30.在項目中什么時候選擇使用GCD喂柒,什么時候選擇使用NSOperation?
>答:無論是GCD還是NSOperation其實都是多線程的一種實現(xiàn)形式胜榔。嚴格的說NSOperation和線程并沒有必然聯(lián)系胳喷,更不是多線程,NSOperation只是操作夭织,封裝了target和action 或者Block,在主線程中執(zhí)行Operation吠撮,Operation就會運行在主線程中尊惰,在子線程中執(zhí)行Operation,Operation就運行在子線程中泥兰。它只有和NSOperationQueue聯(lián)合使用的時候弄屡,才能發(fā)揮出價值。NSOperationQueue是Operation的管理者鞋诗,它首先是一個隊列膀捷,先來的任務(wù)先開始執(zhí)行,后來的任務(wù)后開始執(zhí)行削彬,這些任務(wù)的執(zhí)行是并發(fā)的全庸,NSOperationQueue負責(zé)為任務(wù)開辟線程以及關(guān)閉線程,有點類似于cell重用融痛,用有限的線程執(zhí)行任意數(shù)量的任務(wù)壶笼,同時可以設(shè)置最大并發(fā)數(shù),控制程序的性能雁刷,不至于全部任務(wù)一起執(zhí)行覆劈。GCD出現(xiàn)比NSOperationQueue要晚,是一套基于C函數(shù)的API,由于是C函數(shù)责语,所以性能比較高炮障,使用靈活,安全坤候,當然功能也強大铝阐。但是相對于GCD來講,NSOperationQueue對線程做了封裝铐拐,使用比較簡單徘键,尤其是不用管理線程的開啟和關(guān)閉。個人認為遍蟋,如果僅僅是想要實現(xiàn)異步執(zhí)行任務(wù)吹害,首選GCD,如果要管理多個異步任務(wù)虚青,NSoperationQueue比較方便它呀。如果要做更復(fù)雜的處理,比如前5個任務(wù)并發(fā)棒厘,5個任務(wù)執(zhí)行完之后纵穿,需要串行執(zhí)行3個任務(wù),之后再并發(fā)執(zhí)行若干任務(wù)奢人,就需要使用GCD了谓媒。總的來說何乎,特別簡單的和非常復(fù)雜的多線程任務(wù)GCD比較適合句惯,介于二者之間的用NSOperationQueue比較合適。

#####31.tableView必須實現(xiàn)的兩個方法是什么(手寫)支救?在哪個協(xié)議中聲明的抢野?
>答:在UITableViewDataSource協(xié)議中聲明的兩個必須實現(xiàn)的方法
 1.`-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section`
2.`-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath`

#####32.UITableViewController 中,創(chuàng)建UITableViewCell時各墨,initWithSytle:resuseIdentifier: 中指孤,reuseIdentifier有什么用?簡述UITableViewCell的復(fù)用原理.
>答:只有在cell被滑動出界面的時候贬堵,此cell才會被加入到復(fù)用隊列中恃轩。每次在創(chuàng)建cell的時候,程序會首先通過調(diào)用`dequeueReusableCellWithIdentifier:cellType`方法扁瓢,到復(fù)用隊列中去尋找標示符為“cellType”的cell详恼,如果找不到,返回nil引几,然后程序去通過調(diào)用`[[[UITableViewCell alloc] initWithStyle:style reuseIdentifier:cellType] autorelease]`來創(chuàng)建標示符為“cellType”的cell昧互。

#####33.#include挽铁、#import、@class這三個關(guān)鍵字是什么指令敞掘?
>答:是預(yù)編譯指令叽掘。所謂的預(yù)編譯指令指的就是在編譯之前,先去執(zhí)行的指令。

#####34.在oc中引入頭文件使用的關(guān)鍵字是哪一個玖雁?能在c語言文件中使用嗎更扁?
>答: #import關(guān)鍵字可以在OC中使用,不能在C文件中使用赫冬, #include可以在C和OC中使用浓镜。

#####35.#import與#include相比,好處是什么劲厌?
>答: #import確定一個文件只能被導(dǎo)入一次膛薛,避免的重復(fù)導(dǎo)入的問題,使用#include一定要注意重復(fù)導(dǎo)入的問題补鼻。所以在OC中都使用#import來引用頭文件哄啄。

#####36.#import<>和#import””的區(qū)別是什么?
>答:#import<>用于對系統(tǒng)文件的引用风范,編譯器會在系統(tǒng)文件目錄中去查找文件
\#import””用于對自定義的文件的引用咨跌,編譯器首先回去用戶目錄下查找,然后去安裝目錄硼婿,最后去系統(tǒng)目錄中查找文件锌半。

#####37.@class的作用是什么?
>答:@class的作用是告訴編譯器有@class后面的內(nèi)容是一個類名加酵。只是告訴編譯器存在這么一個類拳喻,類具體包含哪些方法,屬性和變量的并沒有告訴編譯器猪腕。一般在類的頭文件中使用@class來引入其他類。

#####38.多線程的優(yōu)點和缺點分別是什么钦勘?
>答:
> * 優(yōu)點:
1陋葡、將耗時較長的操作(網(wǎng)絡(luò)請求、圖片下載彻采、音頻下載腐缤、數(shù)據(jù)庫訪問等)放在子線程中執(zhí)行,可以防止主線程的卡死肛响;
2岭粤、可以發(fā)揮多核處理的優(yōu)勢,提升cpu的使用率特笋。
> * 缺點:
1剃浇、每開辟一個子線程就消耗一定的資源; 
2、會造成代碼的可讀性變差虎囚;
3角塑、如果出現(xiàn)多個線程同時訪問一個資源,會出現(xiàn)資源爭奪的情況

#####39.NSOperationQueue中有一個屬性叫maxConcurrentCount即最大并發(fā)數(shù)淘讥。這里所謂的最大并發(fā)數(shù)指的是什么含義圃伶?
>答:這里的最大并發(fā)數(shù)指得是在隊列中同時執(zhí)行的任務(wù)的個數(shù)。有很多人會認為是所分配的線程的個數(shù)蒲列。其實不是的窒朋。因為線程的個數(shù)的多少取決于系統(tǒng),系統(tǒng)會分配合適的線程數(shù)量來保證這些任務(wù)并發(fā)執(zhí)行的蝗岖,作為程序員我們是沒辦法控制的侥猩。

#####40.請寫出下面代碼的打印結(jié)果:

NSLog(@"1”);
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3”);

>答:只能打印1.第一行代碼按照順序會打印1.當執(zhí)行到第二段代碼的時候出現(xiàn)了問題。因為在主線程中使用了同步剪侮,這時為了執(zhí)行block內(nèi)部的代碼需要阻塞當前線程去執(zhí)行Block拭宁,但是由于block也是在主線程里面執(zhí)行,主線程當前還有任務(wù)沒執(zhí)行完瓣俯,產(chǎn)生主線程死鎖現(xiàn)象杰标。代碼沒辦法繼續(xù)執(zhí)行。

#####41.項目中彩匕,在什么情況下會用到多線程腔剂?
>答:多線程處理包括Core Data的多線程訪問,耗時的數(shù)據(jù)計算驼仪,數(shù)據(jù)庫訪問掸犬,異步網(wǎng)絡(luò)請求以及一些在運行態(tài)內(nèi)存吃緊的情況下處理大文件的方案等。

#####42.iOS中哪些數(shù)據(jù)持久化的方式,各有什么特點,iOS平臺怎么做數(shù)據(jù)的持久化,CoreData和sqlite有無必然聯(lián)系?CoreData是一個關(guān)系型數(shù)據(jù)庫嗎?
>答:iOS中可以有四種持久化數(shù)據(jù)的方式: 屬性列表绪爸、對象歸檔湾碎、SQLite3和Core Data;Core Data可以使你以圖形界面的方式快速的定義app的數(shù)據(jù)模型奠货,同時在你的代碼中容易獲取到它介褥。core data提供了基礎(chǔ)結(jié)構(gòu)去處理常用的功能,例如保存递惋,恢復(fù)柔滔,撤銷和重做,允許你在app中繼續(xù)創(chuàng)建新的任務(wù)萍虽。在使用Core Data的時候睛廊,你不用安裝額外的數(shù)據(jù)庫系統(tǒng),因為core data使用內(nèi)置的sqlite數(shù)據(jù)庫杉编。Core Data將你app的模型層放入到一組定義在內(nèi)存中的數(shù)據(jù)對象中超全。Core Data會追蹤這些對象的改變咆霜,同時可以根據(jù)需要做相反的改變,例如用戶執(zhí)行撤銷命令卵迂。當Core Data在對你app數(shù)據(jù)的改變進行保存的時候裕便,Core Data會把這些數(shù)據(jù)歸檔,并永久性保存见咒。
mac os X中sqlite庫偿衰,它是一個輕量級功能強大的關(guān)系數(shù)據(jù)引擎,也很容易嵌入到應(yīng)用程序改览∠卖幔可以在多個平臺使用,sqlite是一個輕量級的嵌入式sql數(shù)據(jù)庫編程宝当。與core data框架不同的是视事,sqlite是使用程序式的,sql的主要的API來直接操作數(shù)據(jù)表庆揩。
Core Data不是一個關(guān)系型數(shù)據(jù)庫俐东,也不是關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)。雖然Core Dta支持SQLite作為一種存儲類型订晌,但它不能使用任意的SQLite數(shù)據(jù)庫虏辫。Core Data在使用的過程中自己創(chuàng)建這個數(shù)據(jù)庫。Core Data支持對一锈拨、對多的關(guān)系砌庄。

#####43.id聲明的對象有什么特性?
>答:id是任意對象類型的奕枢,不能表示基本類型娄昆。id類型是通用指針類型,因為通過指針缝彬,也就是內(nèi)存地址來引用對象萌焰,所以可以將任意對象賦值給id類型的對象。返回id類型值的方法是返回指向內(nèi)存中某對象的指針谷浅。然后可以將該值賦給任何對象變量(強制類型轉(zhuǎn)換即可)杆怕。因為無論在哪里,對象總是攜帶它的isa成員壳贪。所以即使將它存儲在id類型的通用對象變量中,也總是可以確定它的真實類型寝杖,id是多態(tài)的一種體現(xiàn)违施。

#####44.對于語句NSString* testObject = [[NSData alloc]init];testObject在編譯時和運行時分別是什么類型的對象?
>答:編譯時是NSString瑟幕,運行時是NSData磕蒲。

#####45.什么是懶加載?在使用懶加載時的注意事項是什么留潦?
>答:
(1).所謂的懶加載指的是延遲創(chuàng)建對象,只有當需要的時候才創(chuàng)建對象辣往。
(2).在真正開發(fā)的過程中其實懶加載就是重寫getter方法兔院。在getter方法的內(nèi)部,實現(xiàn)對象的創(chuàng)建站削,如果對象為nil才創(chuàng)建坊萝,如果不為nil,直接返回對象许起。在真正使用懶加載時需要注意的是當?shù)谝淮问褂脤ο髸r十偶,需要調(diào)用self.因為只有這樣才能調(diào)用對應(yīng)的getter方法,對象才會被創(chuàng)建园细。

#####46.談?wù)勀銓unLoop的理解惦积。
>答:一個程序從main函數(shù)開始,函數(shù)執(zhí)行完畢之后就會退出猛频,iOS程序也是一樣的狮崩,但是我們從沒看到過iOS程序打開之后直接閃退,肯定是有一些東西阻止了程序的退出鹿寻,最簡單的就是添加一個死循環(huán)睦柴,    ``RunLoop``就是類似于這樣的一個死循環(huán),保證你的應(yīng)用程序不被退出烈和,區(qū)別就是``RunLoop``會在你的程序有事件(點擊事件爱只、搖晃事件等)要處理的時候才會去讓``cpu``處理,在程序沒有事件處理的時候就讓系統(tǒng)``cpu``休眠招刹。在iOS中恬试,每個線程都有一個``RunLoop``,但是默認狀態(tài)下只有主線程的``RunLoop``是開啟的(系統(tǒng)自動幫我們開啟)疯暑,其他線程開啟需要以下代碼

BOOL isRunning = NO;
while (!isRunning) {
isRunning = [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}

``currentRunLoop ``可以獲取當前線程的``RunLoop`` 训柴, 循環(huán)是為了保證能開啟``RunLoop``(系統(tǒng)繁忙時有可能開啟失敗)
如果用``timerWithTimeInterval``來創(chuàng)建``NSTimer``妇拯,我們需要把這個``Timer``假如到``RunLoop``才能執(zhí)行幻馁,如果是在子線程,還需要開啟這個``RunLoop``越锈。

#####47.簡單描述一下``RunLoop``在實際開發(fā)中的應(yīng)用場景仗嗦。
>答:在做項目時曾遇到過兩個問題,需要手動開啟runLoop:
1.在一個頁面中有一個輪播圖和``tableView``甘凭。在滑動tableView的過程中稀拐,輪播圖不動了。這時我是用了``RunLoop``將輪播圖的NSTimer加入到了``RunLoop``中丹弱。
2.在子線程中開啟了另外一個子線程用于下載圖片德撬。這時發(fā)現(xiàn)下載圖片的代碼不執(zhí)行铲咨。通過在下載圖片的代碼里手動開啟``RunLoop``,代碼才可以執(zhí)行蜓洪。

#####48.什么是Runtime
>答:``Runtime``就是運行時纤勒,一個程序開發(fā)的過程通常可以分為以下階段隆檀,編輯-預(yù)編譯-編譯-連接-運行摇天,運行時可以說就是我們的程序再運行的階段發(fā)生的一些事情,在這個階段程序通常會把一些``OC``的代碼轉(zhuǎn)化成C語言的代碼刚操,從而提高執(zhí)行的效率闸翅,在這個階段我們也可以動態(tài)的為某個對象的屬性賦值,而對象的屬性具體是什么類型也會在這個階段進行確定(``NSString *str = [NSData data]``; 其中str在編譯的時候是NSString類型菊霜,運行的時候是NSData類型)坚冀。系統(tǒng)也提供了``Runtime``的類庫,讓我們可以直接調(diào)用一些運行時把OC代碼轉(zhuǎn)化C之后的代碼比如:``objc_msgSend()``;同樣也可以通過運行時鉴逞,為分類添加屬性记某,需要用到``objc_getAssociatedObject``和``objc_setAssociatedObject``函數(shù)。

#####49.解釋這句代碼的意思objc_msgSend(array,@selector(insertObject:atIndex:), foo, 5);
>答:給array 發(fā)送一個insertObject:atIndex: 的消息參數(shù)為 foo 和5构捡, 就是給array再下標為5的地方插入一個foo對象

#####50.OC的優(yōu)缺點:
>答:
> * 優(yōu)點:
1液南、Category」椿眨可以很方便的為一個已有的類添加屬性或者方法滑凉,而不需要笨拙的去繼承它。
2喘帚、posing畅姊。可以讓一個類的對象動態(tài)的以其他類行為去執(zhí)行吹由,也許可以理解成動態(tài)replace所有的method(消息轉(zhuǎn)發(fā)機制若未,比如是用Person類的一個對象去調(diào)用一個Student類的方法)
3、 動態(tài)識別倾鲫。 比較常見的動態(tài)語言的特性粗合,涉及的點就多了,舉個簡單的例子乌昔,判斷一個對象是否是某個類的成員隙疚。isKindOfClass: 
4、彈性訊息傳遞 磕道。方法(method)的動態(tài)處理甚淡,譬如當你調(diào)用一個沒有的方法的時候,系統(tǒng)將是再運行時跑出異常而不是編譯時給出錯誤。5贯卦、 不是一個過度復(fù)雜的 C 衍生語言 
6、 Objective-C 與 C++ 可混合編程
> * 缺點: 
1焙贷、不支持命名空間 (寫過c#等其他語言的應(yīng)該比較清楚撵割,可以通過命名空間將相同名字的類進行分類,而objc中不得不通過前綴進行區(qū)分辙芍,這也是為什么蘋果的類庫都有UIXXX NSXXX等統(tǒng)一前綴了)
2啡彬、不支持運算符重載
3、不支持多重繼承
4故硅、使用動態(tài)運行時類型庶灿,所有的方法都是函數(shù)調(diào)用,所以很多編譯時優(yōu)化方法都用不到吃衅。(如內(nèi)聯(lián)函數(shù)等)往踢,性能低劣。

#####51.寫一個冒泡排序
>答:    

int numbers[5] = {4, 14, 88, 22, 60};
int count = sizeof(numbers) / sizeof(numbers[0]);
for (int i = 0; i < count - 1; i++) {
for (int j = 0; j < count - 1 - i; j++) {
if (numbers[j] > numbers[j + 1]) {
int temp = numbers[j];
numbers[j] = numbers[j + 1];
numbers[j + 1] = temp;
}
}
}


#####52.用OC寫一個冒泡排序
>答:  

NSMutableArray *numbers = [@[@42, @75, @22, @14, @1, @55] mutableCopy];
for (int i = 0; i < numbers.count - 1; i++) {
for (int j = 0; j < numbers.count - 1 - i; j++) {
if ([numbers[j] integerValue] > [numbers[j + 1] integerValue]) {
[numbers exchangeObjectAtIndex:j withObjectAtIndex:j + 1];
}
}
}


#####53.如何優(yōu)化冒泡排序
>答:添加一個BOOL來標識當前的數(shù)組是否有序徘层,在外層循環(huán)條件增加判斷峻呕,無序(NO)的情況下再排序,每次進入循環(huán)假設(shè)是有序的(YES)趣效,無序的時候(進入if條件)把這個標識設(shè)置為無序(NO)瘦癌,如果沒有進入if條件就說明當前的數(shù)組已經(jīng)是有序的,則下次循環(huán)的時候會根據(jù)添加的條件自動停止循環(huán)

int flag = 0;
int numbers[5] = {4, 14, 88, 22, 60};
int count = sizeof(numbers) / sizeof(numbers[0]);
for (int i = 0; i < count - 1 && flag == 0; i++) {
flag = 1;
for (int j = 0; j < count - 1 - i; j++) {
if (numbers[j] > numbers[j + 1]) {
int temp = numbers[j];
numbers[j] = numbers[j + 1];
numbers[j + 1] = temp;
flag = 0;
}
}
}


#####54.寫一個冒泡排序的函數(shù)
>```
void sort(int array[], int count){
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - 1 - i; j++) {
            if (array[j] > array[j + 1]) {
                int temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
}
int main(int argc, const char * argv[]) {
    int flag = 0;
    int numbers[5] = {4, 14, 88, 22, 60};
//如果函數(shù)實現(xiàn)在main函數(shù)后面需要先聲明sort函數(shù)
    int count = sizeof(numbers) / sizeof(numbers[0]);
    sort(numbers, count);
    for (int i = 0; i < count; i++) {
        printf("%d\n", numbers[i]);
    }
    return 0;
}
55.簡述你對UIView跷敬、UIWindow讯私、CALayer的理解。

答:CALayer是圖層類西傀,本身可以顯示的斤寇,但是不能響應(yīng)事件。
UIView是iOS系統(tǒng)中界面元素的基礎(chǔ)池凄,所有的界面元素都繼承自它抡驼。事件的處理由它來執(zhí)行,但是顯示其實是由其對應(yīng)的layer層來操作的肿仑,UIView內(nèi)嵌了一個layer致盟,layer顯示內(nèi)容,UIView本身增加了事件處理的功能尤慰。
UIWindow繼承自UIView馏锡,主要的作用是作為窗口呈現(xiàn)其他的視圖。而且一個應(yīng)用程序一般情況下只有一個窗口伟端。

56.在iOS中如何實現(xiàn)國際化杯道?

答:iOS中國際化需要做相關(guān)的配置:
(1)選中應(yīng)用程序?qū)?yīng)的project,然后添加所需要國際化的語言责蝠。
(2)新建Localizable.strings文件党巾,作為多語言對應(yīng)的詞典萎庭,存儲多種語言,點擊右側(cè)Localization齿拂,勾選國際化對應(yīng)的語言驳规。
(3)添加一個字段,設(shè)置你想要國際化的字段
在English中署海,添加:SUBMIT_BTN_TITLE = Go;
在Chinese中吗购,添加:SUBMIT_BTN_TITLE = 開始;

57.簡單描述你一下在開發(fā)的過程中,如何實現(xiàn)程序的性能優(yōu)化砸狞?

答:我在開發(fā)的過程中會注意一下幾點來優(yōu)化程序性能:
1.避免龐大的XIB
2.使用懶加載的方式延遲加載界面
3.避免反復(fù)處理數(shù)據(jù)
4.避免使用NSDateFormatter和NSCalendar捻勉。
5.圖片緩存的取舍
UIImage加載圖片方式一般有兩種:
A:imagedNamed初始化
B:imageWithContentsOfFile初始化
二者不同之處在于,imageNamed默認加載圖片成功后會內(nèi)存中緩存圖片,這個方法用一個指定的名字在系統(tǒng)緩存中查找并返回一個圖片對象.如果緩存中沒有找到相應(yīng)的圖片對象,則從指定地方加載圖片然后緩存對象,并返回這個圖片對象.
而imageWithContentsOfFile則僅只加載圖片,不緩存.
大量使用imageNamed方式會在不需要緩存的地方額外增加開銷CPU的時間來做這件事.當應(yīng)用程序需要加載一張比較大的圖片并且使用一次性刀森,那么其實是沒有必要去緩存這個圖片的踱启,用imageWithContentsOfFile是最為經(jīng)濟的方式,這樣不會因為UIImage元素較多情況下,CPU會被逐個分散在不必要緩存上浪費過多時間.使用場景需要編程時撒强,應(yīng)該根據(jù)實際應(yīng)用場景加以區(qū)分禽捆,UIImage雖小,但使用元素較多問題會有所凸顯.

58.XMPP的優(yōu)點和缺點在于什么地方飘哨?

答:XMPP是一種即時通訊協(xié)議胚想,基于XML的點對點的即時通訊協(xié)議。它的優(yōu)點有:
1.開放:XMPP本身是開放的芽隆,所以在客戶端浊服、數(shù)據(jù)庫等方面都有很多具體的實現(xiàn)和應(yīng)用。
2.安全:
3.可擴展:XML命名空間的威力可使任何人在核心協(xié)議的基礎(chǔ)上建造定制化的功能
缺點:
只能傳輸文本胚吁,不能傳輸音頻牙躺,視頻和圖片。如果要傳輸音頻腕扶,視頻和圖片孽拷,需要通過http協(xié)議傳到服務(wù)器,服務(wù)器返回一個url半抱,這個url再通過XMPP傳遞給對方脓恕,對方拿到之后,再通過url去下載和顯示窿侈。

59.如何讓你的應(yīng)用程序更加省電炼幔?

答:(1)如果程序用到定位,需要在定位完畢之后關(guān)閉定位史简,或者降低定位的頻率乃秀,不停的定位會消耗電量。(2)如果用到了藍牙,需要使用藍牙時候開啟藍牙跺讯,藍牙用完之后關(guān)閉藍牙枢贿,藍牙也很耗電。(3)優(yōu)化算法抬吟,減少循環(huán)次數(shù)萨咕,大量循環(huán)會讓CPU一直處于忙碌狀態(tài),特別費電火本。(4)不要使用網(wǎng)絡(luò)輪詢,使用推送聪建。(5)timer的時間間隔不宜太短钙畔,滿足需求即可。(5)不要頻繁刷新頁面金麸,能刷新1行cell擎析,不要reloadData。(6)切勿讓屏幕長亮挥下。(7)線程適量揍魂,不宜過多。

60.如何實現(xiàn)程序后臺運行棚瘟?

答:蘋果是不贊成程序在后臺運行的(因為很費電)现斋,除非后臺運行能提升用戶體驗。有3種情況允許程序后臺運行偎蘸。(1)在前臺開啟了一個短任務(wù)庄蹋,可以在程序進入后臺的時候,向系統(tǒng)申請點時間把任務(wù)執(zhí)行完迷雪。(2)前臺有下載任務(wù)限书,可以在進入后臺的時候繼續(xù)下載。(3)一些特定類型的任務(wù)可以在后臺運行章咧,比如:定位倦西,音樂播放,VoIP等等赁严。
對于第一種情況扰柠,可以調(diào)用UIApplication類的beginBackgroundTaskWithName:expirationHandler:或者beginBackgroundTaskWithExpirationHandler:方法申請一點額外的時間去執(zhí)行未完成的任務(wù)。調(diào)用這兩個方法中的一個都會臨時延遲應(yīng)用程序進入休眠的時間误澳,以便有時間把任務(wù)執(zhí)行完耻矮。當任務(wù)執(zhí)行完畢之后,應(yīng)用程序需要調(diào)用endBackgroundTask:方法讓系統(tǒng)知道任務(wù)執(zhí)行完了忆谓,程序可以進入休眠狀態(tài)了裆装。不一定非得等應(yīng)用程序要進入后臺了才設(shè)置后臺需要執(zhí)行的任務(wù)。一個好的設(shè)計應(yīng)該是在任務(wù)開始前就是用beginBackgroundTaskWithName:expirationHandler:或者beginBackgroundTaskWithName:expirationHandler:添加后臺執(zhí)行的任務(wù),任務(wù)一旦執(zhí)行完就調(diào)用endBackgroundTask:方法告訴后臺哨免,需要進入后臺執(zhí)行的任務(wù)執(zhí)行完了(此時可能還沒進入后臺)茎活。
對于第二種情況,如果要下載文件琢唾,應(yīng)用程序應(yīng)該使用NSURLSession對象去開啟下載任務(wù)载荔,這樣系統(tǒng)就可以在程序休眠的時候控制下載,當我們配置NSURLSession需要在后臺傳輸?shù)臅r候采桃,系統(tǒng)會單獨開一個進程去處理下載任務(wù)懒熙,如果在下載的時候,進入了后臺普办,會在后臺繼續(xù)下載工扎。想要實現(xiàn)后臺下載,我們需要配置NSURLSession衔蹲。首先創(chuàng)建一個NSURLSessionConfiguration對象肢娘,設(shè)置一些屬性,然后把NSURLSessionConfiguration對象設(shè)置給NSURLSession對象舆驶。具體步驟:(1)使用backgroundSessionConfigurationWithIdentifier:創(chuàng)建NSURLSessionConfiguration對象橱健。(2)設(shè)置NSURLSessionConfiguration對象的sessionSendsLaunchEvents 屬性為YES。(3)如果在前臺已經(jīng)開始下載了沙廉,還需要設(shè)置NSURLSessionConfiguration的discretionary屬性為YES拘荡。(4)為NSURLSessionConfiguration對象設(shè)置其他你需要的屬性。(5)把NSURLSessionConfiguration對象設(shè)置給NSURLSession對象蓝仲。
第三種情況屬于Long-Running任務(wù)俱病。如果需要實現(xiàn)長時任務(wù),必須去申請袱结,而且只有特定的類型才能長時間在后臺執(zhí)行亮隙。比如:后臺播放音頻,后臺錄音垢夹,后臺定位和導(dǎo)航溢吻,VoIP,定期下載和處理新內(nèi)容果元,定期接收外設(shè)的數(shù)據(jù)促王。需要在Info.plist添加UIBackgroundModes字段選擇需要后臺運行的事件類型,或者在工程的Capabilities里面打開Background Modes而晒,勾選對應(yīng)的事件蝇狼,告訴系統(tǒng)會在后臺運行什么類型的Long-Running任務(wù),然后再根據(jù)不同類型的事件做相應(yīng)的處理即可倡怎。

61.什么是arc迅耘?(arc是為了解決什么問題誕生的混驰?)

首先解釋ARC: automatic reference counting自動引用計數(shù)屎蜓。
ARC幾個要點:
在對象被創(chuàng)建時 retain count +1,在對象被release時 retain count -1.當retain count 為0 時猖辫,銷毀對象映皆。
程序中加入autoreleasepool的對象會由系統(tǒng)自動加上autorelease方法蠢挡,如果該對象引用計數(shù)為0嫩与,則銷毀涕刚。
那么ARC是為了解決什么問題誕生的呢?這個得追溯到MRC手動內(nèi)存管理時代說起簇捍。

MRC下內(nèi)存管理的缺點:

1.當我們要釋放一個堆內(nèi)存時只壳,首先要確定指向這個堆空間的指針都被release了。(避免提前釋放)
2.釋放指針指向的堆空間暑塑,首先要確定哪些指針指向同一個堆吕世,這些指針只能釋放一次。(MRC下即誰創(chuàng)建梯投,誰釋放,避免重復(fù)釋放)
3.模塊化操作時况毅,對象可能被多個模塊創(chuàng)建和使用分蓖,不能確定最后由誰去釋放。
4.多線程操作時尔许,不確定哪個線程最后使用完畢
/MRC
//1.block聲明為屬性的時候要使用copy語義(要將從棧區(qū)拷貝到堆區(qū)么鹤,retain無效,即retain和assign會造成野指針問題味廊,因為棧內(nèi)存系統(tǒng)自動回收蒸甜,指向的內(nèi)容不可控)
//2.block釋放的時候要使用專有的Block_release(<#...#>)(block區(qū)別于向內(nèi)存靜態(tài)申請空間(+alloc)的OC普通對象,不符合常規(guī)內(nèi)存管理)
//3.在block實現(xiàn)部分,必須使用__block來修飾實例變量余佛、self柠新。(block會持有其內(nèi)部變量,導(dǎo)致引用計數(shù)+1)
//ARC
//1.block聲明為屬性的時候要使用strong語義,strong會自動將block拷貝一份到堆區(qū)
//2.在block實現(xiàn)部分辉巡,必須使用__weak來修飾實例變量恨憎、self。

怎么理解MVC郊楣,在Cocoa中MVC是怎么實現(xiàn)的憔恳?

MVC設(shè)計模式考慮三種對象:模型對象、視圖對象净蚤、和控制器對象钥组。模型對象代表特別的知識和專業(yè)技能,它們負責(zé)保有應(yīng)用程序的數(shù)據(jù)和定義操作數(shù)據(jù)的邏輯今瀑。視圖對象知道如何顯示應(yīng)用程序的模型數(shù)據(jù)程梦,而且可能允許用戶對其進行編輯点把。控制器對象是應(yīng)用程序的視圖對象和模型對象之間的協(xié)調(diào)者作烟。

3.手寫單例?

+(instancetype)shareSingleTon{
static SingleTon * singleton = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (singleton == nil) {
singleton = [[singleton alloc]init];
}
});
return singleton;
}


#####62 什么是 KVC 和 KVO?
>答:KVC(Key-Value-Coding)內(nèi)部的實現(xiàn):一個對象在調(diào)用 setValue 的時候,(1)首先根據(jù)方法名找到運行方法的時候所需要的環(huán) 境參數(shù)愉粤。(2)他 會從自己 isa 指針結(jié)合環(huán)境參數(shù),找到具體的方法實現(xiàn)的接口。(3)再直接查找得來的具 體的方法實現(xiàn)拿撩。KVO(Key-Value- Observing):當觀察者為一個對象的屬性進行了注冊, 被觀察對象的 isa 指針被修改的時候,isa 指針就會指向一個中間類,而不是真實的類衣厘。所 以 isa 指針其實不需要指向?qū)嵗龑ο笳鎸嵉念悺K晕覀兊某绦蜃詈貌灰蕾囉?isa 指針压恒。 在調(diào)用類的方法的時候,最好要明確對象實例的類名

#####63 概念
>面向?qū)ο?Object Oriented,OO)是軟件開發(fā)方法影暴。面向?qū)ο蟮母拍詈蛻?yīng)用已超越了程序設(shè)計和軟件開發(fā),擴展到如數(shù)據(jù)庫系統(tǒng)探赫、交互式界面型宙、應(yīng)用結(jié)構(gòu)、應(yīng)用平臺伦吠、分布式系統(tǒng)妆兑、網(wǎng)絡(luò)管理結(jié)構(gòu)、CAD技術(shù)毛仪、人工智能等領(lǐng)域搁嗓。面向?qū)ο笫且环N對現(xiàn)實世界理解和抽象的方法,是計算機編程技術(shù)[1]  發(fā)展到一定階段后的產(chǎn)物箱靴。

#####64.關(guān)鍵字
> * atomic:
原子操作(原子性是指事務(wù)的一個完整操作腺逛,操作成功就提交,反之就回滾. 原子操作就是指具有原子性的操作)在objective-c 屬性設(shè)置里面 默認的就是atomic 衡怀,意思就是 setter /getter函數(shù)是一個原子操作棍矛,如果多線程同時調(diào)用setter時,不會出現(xiàn)某一個線程執(zhí)行完setter所有語句之前抛杨,另一個線程就開始執(zhí)行setter够委,相當于 函數(shù)頭尾加了鎖 . 這樣的話 并發(fā)訪問性能會比較低 .
> * nonatomic:
非原子操作 一般不需要多線程支持的時候就用它,這樣在 并發(fā)訪問的時候效率會比較高 . 在objective-c里面通常對象類型都應(yīng)該聲明為非原子性的. iOS中程序啟動的時候系統(tǒng)只會自動生成一個單一的主線程.程序在執(zhí)行的時候一般情況下是在同一個線程里面對一個屬性進行操作. 如果在程序中 我們確定某一個屬性會在多線程中被使用蝶桶,并且需要做數(shù)據(jù)同步慨绳,就必須設(shè)置成原子性的,但也可以設(shè)置成非原子性的真竖,然后自己在程序中用加鎖之類的來做數(shù)據(jù)同步.
在頭文件中聲明屬性的時候使用atomic 和 nonatomic等價于在頭文件里面添加2個函數(shù)一個是用于設(shè)置這個屬性的脐雪,一個是用于讀取這個屬性,例如:- (nsstring *)name; - (void)setName:(NSString *)str;
atomic / nonatomic 需要和@synthesize/@dynamic配和使用才有意義.
> * @synthesize
如果沒有實現(xiàn)setter和getter方法恢共,編譯器將會自動在生產(chǎn)setter和getter方法战秋。
> * @dynamic
表示變量對應(yīng)的屬性訪問器方法 , 是動態(tài)實 現(xiàn)的 , 你需要在 NSObject 中繼承而來的 +(BOOL) resolveInstanceMethod:(SEL) sel 方法中指定 動態(tài)實現(xiàn)的方法或者函數(shù)。
屬性修飾其他關(guān)鍵字:
> * getter=getterName
指定 get 方法讨韭,并需要實現(xiàn)這個方法 脂信。必須返回與聲明類型相同的變量癣蟋,沒有參數(shù)
> * setter=setterName
指定 set 方法,并需要實現(xiàn)這個方法 狰闪。帶一個與聲明類型相同的參數(shù)疯搅,沒有返回值(返回空值)
當聲明為 readonly 的時候,不能指定 set 方法
> * readwrite
如果沒有聲明成 readonly 埋泵,那就 默認是 readwrite 幔欧。可以用來賦值丽声,也可以被賦值
> * readonly
不可以被賦值
> * assign
所有屬性都 默認 assign 礁蔗,通常用于標量(簡單變量 int , float 雁社, CGRect 等)
一種典型情況是用在對對象沒有所有權(quán)的時候浴井,通常是 delegate ,避免造成死循環(huán)(如果用 retain 的話會死循環(huán))
> * retain
屬性必須是 objc 對象霉撵,擁有對象所有權(quán)磺浙,必須在 dealloc 中 release 一次。
> * copy
屬性必須是 objc 對象徒坡,擁有對象所有權(quán)屠缭,必須在 dealloc 中 release 一次。且屬性必須實現(xiàn) NSCopying 協(xié)議
一般常用于 NSString 類型
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末崭参,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子款咖,更是在濱河造成了極大的恐慌何暮,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铐殃,死亡現(xiàn)場離奇詭異海洼,居然都是意外死亡,警方通過查閱死者的電腦和手機富腊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門坏逢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赘被,你說我怎么就攤上這事是整。” “怎么了民假?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵浮入,是天一觀的道長。 經(jīng)常有香客問我羊异,道長事秀,這世上最難降的妖魔是什么彤断? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮易迹,結(jié)果婚禮上宰衙,老公的妹妹穿的比我還像新娘。我一直安慰自己睹欲,他們只是感情好供炼,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著句伶,像睡著了一般劲蜻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上考余,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天先嬉,我揣著相機與錄音,去河邊找鬼楚堤。 笑死疫蔓,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的身冬。 我是一名探鬼主播衅胀,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酥筝!你這毒婦竟也來了滚躯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嘿歌,失蹤者是張志新(化名)和其女友劉穎掸掏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宙帝,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡丧凤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了步脓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愿待。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖靴患,靈堂內(nèi)的尸體忽然破棺而出仍侥,到底是詐尸還是另有隱情,我是刑警寧澤鸳君,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布访圃,位于F島的核電站,受9級特大地震影響相嵌,放射性物質(zhì)發(fā)生泄漏腿时。R本人自食惡果不足惜况脆,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望批糟。 院中可真熱鬧格了,春花似錦、人聲如沸徽鼎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽否淤。三九已至悄但,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間石抡,已是汗流浹背檐嚣。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留啰扛,地道東北人嚎京。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像隐解,于是被迫代替她去往敵國和親鞍帝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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

  • 內(nèi)存管理 簡述OC中內(nèi)存管理機制煞茫。與retain配對使用的方法是dealloc還是release帕涌,為什么?需要與a...
    丶逐漸閱讀 1,971評論 1 16
  • 1.OC里用到集合類是什么续徽? 基本類型為:NSArray宵膨,NSSet以及NSDictionary 可變類型為:NS...
    輕皺眉頭淺憂思閱讀 1,379評論 0 3
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,160評論 30 470
  • 1.objective-c常見面試題:1、**OC **語言的基本特點OC 語言是 C 語言的一個超集,只是在 C...
    LZM輪回閱讀 965評論 0 3
  • 多線程炸宵、特別是NSOperation 和 GCD 的內(nèi)部原理。運行時機制的原理和運用場景谷扣。SDWebImage的原...
    LZM輪回閱讀 2,009評論 0 12