最新整理:iOS面試題-面試常問問題(一)

前言:

最近把 iOS 面試中可能會(huì)遇到的問題整理了一番, 題目大部分是網(wǎng)上收錄的, 方便自己鞏固復(fù)習(xí), 也分享給大家肮疗; 希望對(duì)大家有所幫助!

  • 對(duì)于答案扒接,不一定都合適伪货,歡迎大家積極討論;整理不易钾怔,如果您覺得還不錯(cuò)碱呼,麻煩在文末 “點(diǎn)個(gè)贊” ,或者留下您的評(píng)論“Mark” 一下宗侦,謝謝您的支持

目錄合集

iOS面試題-面試常問問題(一)

1. #include愚臀、#import先慷、@class的區(qū)別?

  • 在C 語(yǔ)言中, 我們使用 #include 來引入頭文件,如果需要防止重復(fù)導(dǎo)入需要使用#ifndef...#define...#endif
  • 在OC語(yǔ)言中, 我們使用#import來引入頭文件,可以防止重復(fù)引入頭文件,可以避免出現(xiàn)頭文件遞歸引入的現(xiàn)象艾猜。
  • @class僅用來告訴編譯器,有這樣一個(gè)類区匣,編譯代碼時(shí)梦皮,不報(bào)錯(cuò),不會(huì)拷貝頭文件.如果需要使用該類或者內(nèi)部方法需要使用 #import導(dǎo)入

2. id 和 instancetype的區(qū)別?

  • id可以作為方法的返回以及參數(shù)類型 也可以用來定義變量
  • instancetype 只能作為函數(shù)或者方法的返回值
  • instancetype對(duì)比id的好處就是: 能精確的限制返回值的具體類型

3. New 作用是什么?

  1. 向計(jì)算機(jī)(堆區(qū))申請(qǐng)內(nèi)存空間;
  2. 給實(shí)例變量初始化;
  3. 返回所申請(qǐng)空間的首地址;

4.OC實(shí)例變量的修飾符? 及作用范圍?

@puplic

 1.可以在其他類中訪問被@public修飾的成員變量
 2.也可以在本類中訪問被@public修飾的成員變量
 3.可以在子類中訪問父類中被@public修飾的成員變量

@private

1.不可可以在其他類中訪問被@private修飾的成員變量
2.也可以在本類中訪問被@private修飾的成員變量
3.不可以在子類中訪問父類中被@private修飾的成員變量

@protected (默認(rèn)情況下所有的實(shí)例變量都是protected)

1.不可可以在其他類中訪問被@protected修飾的成員變量
2.也可以在本類中訪問被@protected修飾的成員變量
3.可以在子類中訪問父類中被@protected修飾的成員變量

@package

介于public和private之間的,如果是在其他包中訪問就是private,在當(dāng)前代碼中訪問就是public.

5. @proprety的作用

@property = ivar + getter + setter;

  1. 在.h文件中幫我們自動(dòng)生成getset方法聲明
  2. 在.m文件中幫我們生成私有的實(shí)例變量(前提是沒有在.h文件中沒有手動(dòng)生成)
  3. 在.m文件中幫我們是實(shí)現(xiàn)get和set方法的實(shí)現(xiàn)
  • 注意:
    在使用@property情況下,可以重寫getter和setter方法.需要注意的是, 當(dāng)把setter和getter方法都實(shí)現(xiàn)了之后,實(shí)例變量也需要手動(dòng)添加.

6. @proprety 參數(shù)說明?

  • 原子性---atomic/nonatomic 如果不寫默認(rèn)情況為 atomic(系統(tǒng)會(huì)自動(dòng)加上同步鎖,影響性能),在 iOS 開發(fā)中盡量指定為 nonatomic桃焕,這樣有助于提高程序的性能
  • 讀/寫權(quán)限---readwrite(讀寫)剑肯、readooly (只讀)
  • 內(nèi)存管理語(yǔ)義---retain、assign观堂、strong让网、 weak呀忧、unsafe_unretained、copy
  • 方法名---getter=溃睹、setter=

7 NSObject和id的區(qū)別?

  • NSObject和id都可以指向任何對(duì)象
  • NSObject對(duì)象會(huì)在編譯時(shí)進(jìn)行檢查,需要強(qiáng)制類型轉(zhuǎn)換
  • id類型不需要編譯時(shí)檢查,不需要強(qiáng)制類型轉(zhuǎn)換

8. id類型, nil , Nil ,NULL和NSNULL的區(qū)別?

  • id類型: 是一個(gè)獨(dú)特的數(shù)據(jù)類型而账,可以轉(zhuǎn)換為任何數(shù)據(jù)類型,id類型的變量可以存放任何數(shù)據(jù)類型的對(duì)象因篇,在內(nèi)部處理上泞辐,這種類型被定義為指向?qū)ο蟮闹羔槪瑢?shí)際上是一個(gè)指向這種對(duì)象的實(shí)例變量的指針; id 聲明的對(duì)象具有運(yùn)行時(shí)特性竞滓,既可以指向任意類型的對(duì)象
  • nil 是一個(gè)實(shí)例對(duì)象值;如果我們要把一個(gè)對(duì)象設(shè)置為空的時(shí)候,就用nil
  • Nil 是一個(gè)類對(duì)象的值,如果我們要把一個(gè)class的對(duì)象設(shè)置為空的時(shí)候,就用Nil
  • NULL 指向基本數(shù)據(jù)類型的空指針(C語(yǔ)言的變量的指針為空)
  • NSNull 是一個(gè)對(duì)象,它用在不能使用nil的場(chǎng)合

9. atomic和nonatomic區(qū)別,以及作用?

atomicnonatom的主要區(qū)別就是系統(tǒng)自動(dòng)生成的getter/setter方法不一樣

  • atomic系統(tǒng)自動(dòng)生成的getter/setter方法會(huì)進(jìn)行加鎖操作
  • nonatomic系統(tǒng)自動(dòng)生成的getter/setter方法不會(huì)進(jìn)行加鎖操作

atomic不是線程安全的

  • 系統(tǒng)生成的getter/setter方法會(huì)進(jìn)行加鎖操作,注意:這個(gè)鎖僅僅保證了getter和setter存取方法的線程安全.
  • 因?yàn)間etter/setter方法有加鎖的緣故,故在別的線程來讀寫這個(gè)屬性之前,會(huì)先執(zhí)行完當(dāng)前操作.
  • atomic 可以保證多線程訪問時(shí)候,對(duì)象是未被其他線程銷毀的(比如:如果當(dāng)一個(gè)線程正在get或set時(shí),又有另一個(gè)線程同時(shí)在進(jìn)行release操作,可能會(huì)直接crash)

10. 什么情況使用 weak 關(guān)鍵字咐吼,相比 assign 有 什么不同?

  • 在 ARC 中,在有可能出現(xiàn)循環(huán)引用的時(shí)候,往往要通過讓其中一端使用 weak 來解決, 比如:delegate 代理屬性, 自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用,沒有必要再?gòu)?qiáng)引用一次,此時(shí)也會(huì)使用 weak,自定義 IBOutlet 控件屬性一般也使用 weak;當(dāng)然商佑,也可以使用 strong锯茄,但是建議使用 weak

weak 和 assign 的不同點(diǎn)

  • weak 策略在屬性所指的對(duì)象遭到摧毀時(shí),系統(tǒng)會(huì)將 weak 修飾的屬性對(duì)象的指針指 向 nil茶没,在 OCnil 發(fā)消息是不會(huì)有什么問題的; 如果使用 assign 策略在屬性所指 的對(duì)象遭到摧毀時(shí)肌幽,屬性對(duì)象指針還指向原來的對(duì)象,由于對(duì)象已經(jīng)被銷毀抓半,這時(shí)候就產(chǎn)生了野指針喂急,如果這時(shí)候在給此對(duì)象發(fā)送消息,很容造成程序奔潰 assigin 可以用于修飾非 OC 對(duì)象,而 weak 必須用于 OC 對(duì)象

11. 代理使用 weak 還是 assign

  • 建議使用 weak, 對(duì)于weak: 指明該對(duì)象并不負(fù)責(zé)保持delegate這個(gè)對(duì)象琅关,delegate這個(gè)對(duì)象的銷毀由外部控制煮岁。
  • 可以使用 assign,也有weak的功效, 對(duì)于使用 assign 修飾delegate, 在對(duì)象釋放前,需要將 delegate 指針設(shè)置為 nil,不然會(huì)產(chǎn)生野指針

12. ARC 下,不顯式指定任何屬性關(guān)鍵字時(shí)涣易,默認(rèn) 的關(guān)鍵字都有哪些?

  • 基本數(shù)據(jù)類型: atomic,readwrite,assign
  • 普通的 OC 對(duì)象: atomic,readwrite,strong

13. 怎么用 copy 關(guān)鍵字?

  • NSString画机、NSArray、NSDictionary 等等經(jīng)常使用 copy 關(guān)鍵字新症,是因?yàn)樗麄冇袑?duì)應(yīng) 的可變類型:NSMutableString步氏、NSMutableArray、NSMutableDictionary徒爹,為確保 對(duì)象中的屬性值不會(huì)無(wú)意間變動(dòng)荚醒,應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份,保護(hù)其封裝性
  • block 也經(jīng)常使用 copy 關(guān)鍵字,方法內(nèi)部的 block 默認(rèn)是 在棧區(qū)的,使用 copy 可以把它放到堆區(qū).
  • 對(duì)于 block 使用 copy 還是 strong 效果是一樣的隆嗅,但是 建議寫上 copy界阁,因?yàn)檫@樣顯示告知調(diào)用者“編譯器會(huì)自動(dòng)對(duì) block 進(jìn)行了 copy 操 作

14. 如何讓自定義類可以用 copy 修飾符?如何重寫帶 copy 關(guān)鍵字的 setter?

若想令自己所寫的對(duì)象具有拷貝功能,則需實(shí)現(xiàn) NSCopying 協(xié)議胖喳。如果自定義的對(duì)象分為可變版本與不可變版本泡躯,那么就要同時(shí)實(shí)現(xiàn) NSCopyiog 與 NSMutableCopying 協(xié)議

// 實(shí)現(xiàn)不可變版本拷貝
- (id)copyWithZone:(NSZone *)zone; 
// 實(shí)現(xiàn)可變版本拷貝
- (id)mutableCopyWithZone:(NSZone *)zone;
// 重寫帶 copy 關(guān)鍵字的 setter
- (void)setName:(NSString *)name {
    _name = [name copy];
}

15. weak 屬性需要在 dealloc 中置 nil 么

  • 在 ARC 環(huán)境無(wú)論是強(qiáng)指針還是弱指針都無(wú)需在 dealloc 設(shè)置為 nil , ARC 會(huì)自動(dòng)幫我們處理
  • 即便是編譯器不幫我們做這些,weak 也不需要在 dealloc 中置 nil 在屬性所指的對(duì)象遭到摧毀時(shí)较剃,屬性值也會(huì)清空

16.說一下OC的反射機(jī)制;

  • OC的反射機(jī)制主要是基于OC的動(dòng)態(tài)語(yǔ)言特性;
  • 系統(tǒng)Foundation框架為我們提供了一些方法反射的API;
  • 我們可以通過這些API執(zhí)行將字符串轉(zhuǎn)為SEL等操作;
  • 由于OC語(yǔ)言的動(dòng)態(tài)性咕别,這些操作都是發(fā)生在運(yùn)行時(shí)的。

17.手寫單例

方式一: 不是線程安全的,如果多線程需要加鎖

static ClassName *_instance;
+ (instancetype)sharedInstance{
   @synchronized (self) {
       if(!_instance)   {
           _instance = [self alloc]init];
       }
    }
    return _instance;
} 

方式二: 注意多線程問題 GCDdispatch_once 默認(rèn)是線程安全的

  static ClassName *_instance;
    + (instancetype)sharedInstance{
        static dispatch_one_t oneToken;
        dispatch_once(&onetoken,^{
           _instance = [self alloc]init];
        });
        return _instance;
    }

    + (instancetype)allocWithZone:(NSZone *) zone{
      static dispatch_t onetoken;
      dispatch_once(&oncetoken ^{
         _instance = [super allocwithzone:zone];
      })
      retun _instance
    }

18. 什么是僵尸對(duì)象?

  • 已經(jīng)被銷毀的對(duì)象(不能再使用的對(duì)象),內(nèi)存已經(jīng)被回收的對(duì)象写穴。

19.野指針

  • 指向僵尸對(duì)象(不可用內(nèi)存/已經(jīng)釋放的內(nèi)存地址)的指針

比如:

NSObject *obj = [NSObject new];
[obj release]; // obj 指向的內(nèi)存地址已經(jīng)釋放了,
obj 如果再去訪問的話就是野指針錯(cuò)誤了.
野指針錯(cuò)誤形式在Xcode中通常表現(xiàn)為:Thread 1:EXC_BAD_ACCESS惰拱,因?yàn)槟阍L問了一塊已經(jīng)不屬于你的內(nèi)存。

20. 什么是內(nèi)存泄露?

  • 內(nèi)存泄露 :一個(gè)對(duì)象不再使用,但是這個(gè)對(duì)象卻沒有被銷毀,空間沒有釋放,則這個(gè)就叫做內(nèi)存泄露.
  • ARC導(dǎo)致的循環(huán)引用 block,delegate,NSTimer等.

21.數(shù)組copy后里面的元素會(huì)復(fù)制一份新的嗎

  • 不會(huì),數(shù)組里面存的是之前對(duì)象的地址,不會(huì)改變,可以自己測(cè)試一下

22. 如下代碼,會(huì)有什么問題嗎?

@property (copy, nonatomic) NSMutableArray * array

使用 copy 修飾,會(huì)生成不可變數(shù)組,在添加刪除數(shù)組元素時(shí)候會(huì)崩潰

23. OC中的NSInteger 和int 有什么區(qū)別

  • 在32位操作系統(tǒng)時(shí)候, NSInteger 等價(jià)于 int,即32位
  • 在64位操作系統(tǒng)時(shí)候, NSInteger 等價(jià)于 long,即64位

24. @synthesize 和 @dynamic 分別有什么作用

  • @property 有兩個(gè)對(duì)應(yīng)的詞啊送,一個(gè)是@synthesize偿短,一個(gè)是@dynamic
  • 如果 @synthesize 和@dynamic都沒寫删掀,那么默認(rèn)的就是@syntheszie var = _var;
  • @synthesize 的語(yǔ)義是如果你沒有手動(dòng)實(shí)現(xiàn) setter 方法和 getter 方法翔冀,那么編譯器 會(huì)自動(dòng)為你加上這兩個(gè)方法
  • @dynamic 告訴編譯器:屬性的 setter 與 getter方法由用戶自己實(shí)現(xiàn),不自動(dòng)生成(當(dāng)然對(duì)于 readonly 的屬性只需提供 getter 即可)

25.NSMutableDictionary 中使用setValueForKey 和 setObjectForKey有什么區(qū)別?

  • 根據(jù)官方文檔說明: 一般情況下,如果給NSMutableDictionary 發(fā)送setValue 仍然是調(diào)用了 setObject方法, 如果參數(shù) value 為 nil,則會(huì)調(diào)用removeObject 移除這個(gè)鍵值對(duì);
  • setObjectForKey 是 NSMutableDictionary特有的, value 不能為 nil,否則會(huì)崩潰
  • setValueForKey 是KVC的,key 必須是字符串類型, setObject 的 key 可以是任意類型

26.列舉出延遲調(diào)用的幾種方法?

  • performSelector方法
[self performSelector:@selector(Delay) withObject:nil afterDelay:3.0f];

  • NSTimer定時(shí)器
[NSTimer scheduledTimerWithTimeInterval:3.0f target:self selector:@selector(Delay) userInfo:nil repeats:NO];

  • sleepForTimeInterval
[NSThread sleepForTimeInterval:3.0f];

  • GCD方式
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [self Delay];
    });
- (void)Delay {
 NSLog(@"執(zhí)行"); 
}

27. NSCache 和NSDictionary 區(qū)別?

  1. NSCache可以提供自動(dòng)刪減緩存功能披泪,而且保證線程安全纤子,與字典不同,不會(huì)拷貝鍵款票。
  2. NSCache可以設(shè)置緩存上限控硼,限制對(duì)象個(gè)數(shù)和總緩存開銷。定義了刪除緩存對(duì)象的時(shí)機(jī)艾少。這個(gè)機(jī)制只對(duì)NSCache起到指導(dǎo)作用卡乾,不會(huì)一定執(zhí)行。
  3. NSPurgeableData搭配NSCache使用缚够,可以自動(dòng)清除數(shù)據(jù)幔妨。
  4. 只有那種“重新計(jì)算很費(fèi)勁”的數(shù)據(jù)才值得放入緩存。

28.NSArray 和 NSSet區(qū)別

  • NSSet和NSArray功能性質(zhì)一樣谍椅,用于存儲(chǔ)對(duì)象误堡,屬于集合。
  • NSSet屬于 “無(wú)序集合”雏吭,在內(nèi)存中存儲(chǔ)方式是不連續(xù)
  • NSArray是 “有序集合” 它內(nèi)存中存儲(chǔ)位置是連續(xù)的锁施。
  • NSSet,NSArray都是類杖们,只能添加對(duì)象悉抵,如果需要加入基本數(shù)據(jù)類型(int,float摘完,BOOL姥饰,double等),需要將數(shù)據(jù)封裝成NSNumber類型孝治。
  • 由于NSSet是用hash實(shí)現(xiàn)的所以就造就了它查詢速度比較快列粪,但是我們不能把某某對(duì)象存在第幾個(gè)元素后面之類的有關(guān)下標(biāo)的操作栅螟。

29.聲明一個(gè)函數(shù),傳入值是一個(gè)輸入輸出參數(shù)都是 int的 block 函數(shù)

- (void)test_Function:(int(^)(int num)) block{}

30.面向?qū)ο蠛兔嫦蜻^程的區(qū)別?

  • 面向過程:注重的是解決問題的步驟,比如C語(yǔ)言
  • 面向?qū)ο?關(guān)注的是解決問題的去要那些對(duì)象,OC語(yǔ)言就是面向?qū)ο?/li>

31.對(duì)象方法和類方法的區(qū)別?

  • 對(duì)象方法:以減號(hào)開頭,只可以被對(duì)象調(diào)用,可以訪問成員變量
  • 類方法:以加號(hào)開頭只能用類名調(diào)用,對(duì)象不可以調(diào)用,類方法不能訪問成員變量

32. 什么是面向過程?(POP--Procedure Oriented Programming)

  • “面向過程”(Procedure Oriented)是一種以過程為中心的編程思想。就是分析出解決問題所需要的步驟篱竭,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn),使用的時(shí)候一個(gè)一個(gè)依次調(diào)用就可以了步绸。注重的是實(shí)現(xiàn)過程!

33. 什么是面向?qū)ο?(OOP--Object Oriented Programming)

  • “面向?qū)ο蟆笔且环N以對(duì)象為中心的編程思想掺逼。

  • 面向?qū)ο蟮娜筇匦裕?/p>

  1. 封裝
    隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外提供公共訪問方式瓤介,將變化隔離吕喘,便于使用,提高復(fù)用性和安全性刑桑。
  2. 繼承
    提高代碼復(fù)用性氯质;建立了類之間的關(guān)系;子類可以擁有父類的所有成員變量的方法祠斧;繼承是多態(tài)的前提闻察。
  3. 多態(tài)
    父類或接口定義的引用變量可以指向子類或具體實(shí)現(xiàn)類的實(shí)例對(duì)象。提高了程序的拓展性琢锋。
  • 正因?yàn)槊嫦驅(qū)ο缶幊逃兄N特性辕漂,繼承、封裝吴超、多態(tài)钉嘹,從而使得面向?qū)ο缶幊谈哂腥菀鬃屓私邮埽N近與人們的生活鲸阻,比面向?qū)ο缶幊谈臃奖闩c快捷跋涣,一定程度上降低了程序員的工作量,使程序的可讀性也得到了提高鸟悴,代碼的效率也得到了提高陈辱。

34. 什么是多態(tài)?

  • 多態(tài)在面向?qū)ο笳Z(yǔ)言中指同一個(gè)接口有多種不同的實(shí)現(xiàn)方式,在OC中,多態(tài)則是不同對(duì)象對(duì)同一消息的不同響應(yīng)方式;子類通過重寫父類的方法來改變同一方法的實(shí)現(xiàn).體現(xiàn)多態(tài)性
  • 通俗來講: 多態(tài)就父類類型的指針指向子類的對(duì)象,在函數(shù)(方法)調(diào)用的時(shí)候可以調(diào)用到正確版本的函數(shù)(方法)。
  • 多態(tài)就是某一類事物的多種形態(tài).繼承是多態(tài)的前提;

35. 什么是分類?

  • 分類: 在不修改原有類代碼的情況下,可以給類添加方法
    Categroy 給類擴(kuò)展方法,或者關(guān)聯(lián)屬性, Categroy底層結(jié)構(gòu)也是一個(gè)結(jié)構(gòu)體:內(nèi)部存儲(chǔ)這結(jié)構(gòu)體的名字,那個(gè)類的分類,以及對(duì)象和類方法列表,協(xié)議,屬性信息
  • 通過Runtime加載某個(gè)類的所有Category數(shù)據(jù)
  • 把所有Category的方法遣臼、屬性性置、協(xié)議數(shù)據(jù),合并到一個(gè)大數(shù)組中后面參與編譯的Category數(shù)據(jù)揍堰,會(huì)在數(shù)組的前面
  • 將合并后的分類數(shù)據(jù)(方法鹏浅、屬性、協(xié)議)屏歹,插入到類原來數(shù)據(jù)的前面

36.什么是協(xié)議?

  • 協(xié)議:協(xié)議是一套標(biāo)準(zhǔn)隐砸,這個(gè)標(biāo)準(zhǔn)中聲明了很多方法,但是不關(guān)心具體這些方法是怎么實(shí)現(xiàn)的蝙眶,具體實(shí)現(xiàn)是由遵循這個(gè)協(xié)議的類去完成的季希。
  • 在OC中褪那,一個(gè)類可以實(shí)現(xiàn)多個(gè)協(xié)議,通過協(xié)議可以彌補(bǔ)單繼承的缺陷但是協(xié)議跟繼承不一樣式塌,協(xié)議只是一個(gè)方法列表博敬,方法的實(shí)現(xiàn)得靠遵循這個(gè)協(xié)議的類去實(shí)現(xiàn)。

37.正式協(xié)議&非正式協(xié)議?

  • 非正式協(xié)議:凡是在NSObject或其子類 Foundation 框架中的類增加類別(分類),都是非正式協(xié)議
  • 正式協(xié)議: @protocol

38.如何實(shí)現(xiàn)多繼承?

  1. 類別
  2. 協(xié)議
  3. 消息轉(zhuǎn)發(fā) (后面會(huì)詳細(xì)講述)

39.為什么說OC是一門動(dòng)態(tài)語(yǔ)言峰尝?

  • 動(dòng)態(tài)語(yǔ)言:是指程序在運(yùn)行時(shí)可以改變其結(jié)構(gòu)偏窝,新的函數(shù)可以被引進(jìn),已有的函數(shù)可以被刪除等在結(jié)構(gòu)上的變化
  • 動(dòng)態(tài)類型語(yǔ)言: 就是類型的檢查是在運(yùn)行時(shí)做的。

OC的動(dòng)態(tài)特性可從三方面:

  • 動(dòng)態(tài)類型(Dynamic typing):最終判定該類的實(shí)例類型是在運(yùn)行期間
  • 動(dòng)態(tài)綁定(Dynamic binding):在運(yùn)行時(shí)確定調(diào)用的方法
  • 動(dòng)態(tài)加載(Dynamic loading):在運(yùn)行期間加載需要的資源或可執(zhí)行代碼

40.動(dòng)態(tài)綁定?

  • 動(dòng)態(tài)綁定 將調(diào)用方法的確定也推遲到運(yùn)行時(shí)武学。OC可以先跳過編譯祭往,到運(yùn)行的時(shí)候才動(dòng)態(tài)地添加函數(shù)調(diào)用,在運(yùn)行時(shí)才決定要調(diào)用什么方法火窒,需要傳什么參數(shù)進(jìn)去硼补,這就是動(dòng)態(tài)綁定。
  • 在編譯時(shí)熏矿,方法的 調(diào)用并不和代碼綁定在一起已骇,只有在消實(shí)發(fā)送出來之后,才確定被調(diào)用的代碼曲掰。通過動(dòng)態(tài)類型和動(dòng)態(tài)綁定技術(shù)疾捍,

41. cocoa 和 cocoa touch是什么?區(qū)別?

  • Cocoa包含F(xiàn)oundation和AppKit框架,可用于開發(fā)Mac OS X系統(tǒng)的應(yīng)用程序栏妖。
  • Cocoa Touch包含F(xiàn)oundation和UIKit框架乱豆,可用于開發(fā)iPhone OS系統(tǒng)的應(yīng)用程序。
  • Cocoa是 Mac OS X 的開發(fā)環(huán)境吊趾,Cocoa Touch是 iPhone OS的開發(fā)環(huán)境宛裕。

42. cocoa touch底層技術(shù)架構(gòu)?

cocoa touch底層技術(shù)架構(gòu) 主要分為4層:

  • 可觸摸層 Cocoa Touch : UI組件,觸摸事件和事件驅(qū)動(dòng),系統(tǒng)接口
  • 媒體層 Media: 音視頻播放,動(dòng)畫,2D和3D圖形
  • Core Server: 核心服務(wù)層,底層特性,文件,網(wǎng)絡(luò),位置服務(wù)區(qū)等
  • Core OS: 內(nèi)存管理,底層網(wǎng)絡(luò),硬盤管理

43. 什么是謂詞?

謂詞(NSPredicate)是OC針對(duì)數(shù)據(jù)集合的一種邏輯帥選條件,類似一個(gè)過濾器,簡(jiǎn)單實(shí)實(shí)用代碼如下:

Person * p1 = [Person personWithName:@"alex" Age:20];
Person * p2 = [Person personWithName:@"alex1" Age:30];
Person * p3 = [Person personWithName:@"alex2" Age:10];
Person * p4 = [Person personWithName:@"alex3" Age:40];
Person * p5 = [Person personWithName:@"alex4" Age:80];

NSArray * persons = @[p1, p2, p3, p4, p5];
//定義謂詞對(duì)象,謂詞對(duì)象中包含了過濾條件
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age < 30"];
//使用謂詞條件過濾數(shù)組中的元素,過濾之后返回查詢的結(jié)果
NSArray *array = [persons filteredArrayUsingPredicate:predicate];

44. 什么是類工廠方法?

類工廠方法就是用來快速創(chuàng)建對(duì)象的類方法, 他可以直接返回一個(gè)初始化好的對(duì)象,具備以下特征:

  1. 一定是類方法
  2. 返回值需要是 id/instancetype 類型
  3. 規(guī)范的方法名說說明類工廠方法返回的是一個(gè)什么對(duì)象,一般以類名首字母小寫開始;

比如系統(tǒng) UIButton 的buttonWithType 就是一個(gè)類工廠方法:

// 類工廠方法
+ (instancetype)buttonWithType:(UIButtonType)buttonType;
// 使用
+ UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];

45. 什么是糖衣語(yǔ)法?

糖衣語(yǔ)法又叫做語(yǔ)法糖語(yǔ)法鹽,是指在計(jì)算機(jī)語(yǔ)言中添加某種語(yǔ)法,這種語(yǔ)法對(duì)語(yǔ)言的功能沒有影響,但更方便程序員使用,增加程序的可讀性,減少代碼出錯(cuò)機(jī)會(huì)

OC中的字面量,其實(shí)就是語(yǔ)法糖

NSNumber * number = @1;
NSArray * array = @[@1, @2, @3];
NSDictionary * dict = @{@"key":@"value"};
NSNumber * num1 = array[0];
NSString * value = dict[@"key"];

46.Svn 和 Git 區(qū)別

  • svn 和 git 都是用來對(duì)項(xiàng)目進(jìn)行版本控制以及代碼管理的.可以監(jiān)測(cè)代碼及資源的更改變化.有利于實(shí)現(xiàn)高效的團(tuán)隊(duì)合作;

  • svn 是集中式的,集中式是指只有一個(gè)遠(yuǎn)程版本庫(kù),git 是分布式的,分布式有本地和遠(yuǎn)程版本庫(kù),本地倉(cāng)庫(kù)都保留了整個(gè)項(xiàng)目的完整備份;
    如果存儲(chǔ)遠(yuǎn)程版本庫(kù)的服務(wù)器掛了,所有人的代碼都無(wú)法提交论泛,甚至丟失版本庫(kù), git則因?yàn)橛斜镜匕姹編?kù)而不會(huì)有這個(gè)問題揩尸。

  • 由于兩者的架構(gòu)不同,git 和 svn 的分支也是不同的, svn 的分支是一個(gè)完整的目錄,包含所有的實(shí)際文件,和中心倉(cāng)庫(kù)是保持同步的,如果某個(gè)團(tuán)隊(duì)成員創(chuàng)建新的分支,那么會(huì)同步到所有的版本成員中,所有人都會(huì)收到影響. 而 git下創(chuàng)建的分支合并前是不會(huì)影響到任何人的.創(chuàng)建分支可以在本地脫機(jī)進(jìn)行任何操作.測(cè)試無(wú)誤后在合并到主分支,然后其他成員才可以看得到.

47.OC中有二維數(shù)組嗎? 如何實(shí)現(xiàn)?

OC中沒有二維數(shù)組, 可以通過一維數(shù)組嵌套來實(shí)現(xiàn)二維數(shù)組;

// 字面量定義
NSArray * array = @[
                    @[@1,@2,@3,@4,@5],
                    @[@11,@12,@13,@14,@15],
                    @[@21,@22,@23,@24,@25],
                    @[@31,@32,@33,@34,@35],
                    @[@41,@42,@43,@44,@45],
                    ];

// 訪問
NSLog(@"%@",array[1][1]);

48.CocoaPods理解

CocoaPods 是一個(gè) objc 的依賴管理工具,而其本身是利用 ruby 的依賴管理 gem 進(jìn)行構(gòu)建的

  • 想深入了解這個(gè)命令執(zhí)行的詳細(xì)內(nèi)容屁奏,可以在這個(gè)命令后面加上 --verbose⊙矣埽現(xiàn)在運(yùn)行這個(gè)命令 pod install --verbose
  • CocoaPod三方庫(kù),會(huì)優(yōu)先編譯

49. --verbose 和 --no-repo-update有什么用?

  • verbose意思為 冗長(zhǎng)的、啰嗦的坟瓢,一般在程序中表示詳細(xì)信息勇边。此參數(shù)可以顯示命令執(zhí)行過程中都發(fā)生了什么。
  • pod install或pod update可能會(huì)卡在Analyzing dependencies步驟折联,因?yàn)檫@兩個(gè)命令會(huì)升級(jí) CocoaPods 的 spec 倉(cāng)庫(kù)粒褒,追加該參數(shù)可以省略此步驟,命令執(zhí)行速度會(huì)提升诚镰。

50. KVC中的集合運(yùn)算符

  1. 簡(jiǎn)單集合運(yùn)算符:@avg奕坟、@sum祥款、@max、@min月杉、@count (只能用在集合對(duì)象中刃跛,對(duì)象屬性必須為數(shù)字類型)
  2. 對(duì)象操作符:
    @unionOfObjects:返回指定屬性的值的數(shù)組,不去重
    @distinctUnionOfObjects:返回指定屬性去重后的值的數(shù)組
  3. 數(shù)組 / 集體操作符:跟對(duì)象操作符很相似苛萎,只不過是在NSArray和NSSet所組成的集合中工作的奠伪。@unionOfArrays:返回一個(gè)數(shù)組,值由各個(gè)子數(shù)組的元素組成首懈,不去重 @distinctUnionOfArrays:返回一個(gè)數(shù)組,值由各個(gè)子數(shù)組的元素組成谨敛,去重 @distinctUnionOfSets:和@distinctUnionOfArrays差不多, 只是它期望的是一個(gè)包含著NSSet對(duì)象的NSSet究履,并且會(huì)返回一個(gè)NSSet對(duì)象。因?yàn)榧喜荒苡兄貜?fù)的值脸狸,所以只有distinct操作最仑。

51.簡(jiǎn)要說明const,宏,static,extern區(qū)分以及使用?

const

const常量修飾符,經(jīng)常使用的字符串常量,一般是抽成宏炊甲,但是蘋果不推薦我們抽成宏泥彤,推薦我們使用const常量。

- const 作用:限制類型
- 使用const修飾基本變量, 兩種寫法效果一致 , b都是只讀變量
  const int b = 5; 
  int const b = 5;   
- 使用const修飾指針變量的變量 
  第一種: const int *p = &a 和 int const *q = &a; 效果一致,*p 的值不能改,p 的指向可以改; 
  第二種: int * const p = &a;  表示 p 的指向不能改,*p 的值可以改
  第三種: 
  const int * const p = &a; *p 值和 p 的指向都不能改

  const 在*左邊, 指向可變, 值不可變
  const 在*的右邊, 指向不可變, 值可變
  const 在*的兩邊, 都不可變

* 基本概念:宏是一種批量處理的稱謂卿啡。一般說來吟吝,宏是一種規(guī)則或模式,或稱語(yǔ)法替換 颈娜,用于說明某一特定輸入(通常是字符串)如何根據(jù)預(yù)定義的規(guī)則轉(zhuǎn)換成對(duì)應(yīng)的輸出(通常也是字符串)剑逃。這種替換在預(yù)編譯時(shí)進(jìn)行,稱作宏展開官辽。編譯器會(huì)在編譯前掃描代碼蛹磺,如果遇到我們已經(jīng)定義好的宏那么就會(huì)進(jìn)行代碼替換,宏只會(huì)在內(nèi)存中copy一份同仆,然后全局替換萤捆,宏一般分為對(duì)象宏和函數(shù)宏。 宏的弊端:如果代碼中大量的使用宏會(huì)使預(yù)編譯時(shí)間變長(zhǎng)俗批。

const與宏的區(qū)別俗或?

* 編譯檢查 宏沒有編譯檢查,const有編譯檢查扶镀;
* 宏的好處 定義函數(shù)蕴侣,方法 const不可以;
* 宏的壞處 大量使用宏臭觉,會(huì)導(dǎo)致預(yù)編譯時(shí)間過長(zhǎng)

static

* 修飾局部變量: 被static修飾局部變量昆雀,延長(zhǎng)生命周期辱志,跟整個(gè)應(yīng)用程序有關(guān),程序結(jié)束才會(huì)銷毀,被 static 修飾局部變量狞膘,只會(huì)分配一次內(nèi)存
* 修飾全局變量: 被static修飾全局變量揩懒,作用域會(huì)修改,也就是只能在當(dāng)前文件下使用

extern

聲明外部全局變量(只能用于聲明挽封,不能用于定義)

常用用法(.h結(jié)合extern聯(lián)合使用)
如果在.h文件中聲明了extern全局變量已球,那么在同一個(gè)類中的.m文件對(duì)全局變量的賦值必須是:數(shù)據(jù)類型+變量名(與聲明一致)=XXXX結(jié)構(gòu)。并且在調(diào)用的時(shí)候辅愿,必須導(dǎo)入.h文件智亮。代碼如下:

.h
@interface ExternModel : NSObject
extern NSString *lhString;
@end 
.m     
@implementation ExternModel
NSString *lhString=@"hello";
@end

調(diào)用的時(shí)候:例如:在viewController.m中調(diào)用,則可以引入:ExternModel.h点待,否則無(wú)法識(shí)別全局變量阔蛉。當(dāng)然也可以通過不導(dǎo)入頭文件的方式進(jìn)行調(diào)用(通過extern調(diào)用)。

52.編譯型和解釋型的區(qū)別?

  • 編譯型語(yǔ)言: 首先是將源代碼編譯生成機(jī)器指令癞埠,再由機(jī)器運(yùn)行機(jī)器碼 (二進(jìn)制)状原。
  • 解釋型語(yǔ)言: 源代碼不是直接翻譯成機(jī)器指令,而是先翻譯成中間代碼苗踪,再由解釋器對(duì)中間代碼進(jìn)行解釋運(yùn)行颠区。

53.動(dòng)態(tài)語(yǔ)言和靜態(tài)語(yǔ)言?

  • 動(dòng)態(tài)類型語(yǔ)言: 是指數(shù)據(jù)類型的檢查是在運(yùn)行時(shí)做的。用動(dòng)態(tài)類型語(yǔ)言編程時(shí)通铲,不用給變量指定數(shù)據(jù)類型毕莱,該語(yǔ)言會(huì)在你第一次賦值給變量時(shí),在內(nèi)部記錄數(shù)據(jù)類型颅夺。
  • 靜態(tài)類型語(yǔ)言: 是指數(shù)據(jù)類型的檢查是在運(yùn)行前(如編譯階段)做的央串。

54.什么是指針常量和常量指針?

  • 常量指針本質(zhì)是指針碗啄,常量修飾它质和,表示這個(gè)指針乃是一個(gè)指向常量的指針(變量)。
    指針指向的對(duì)象是常量稚字,那么這個(gè)對(duì)象不能被更改饲宿。

  • 指針常量的本質(zhì)是一個(gè)常量,而用指針修飾它胆描,那么說明這個(gè)常量的值應(yīng)該是一個(gè)指針瘫想。
    指針常量的值是指針,這個(gè)值因?yàn)槭浅A坎玻圆荒鼙毁x值

55. 指針函數(shù)和函數(shù)指針

指針函數(shù)

  • 指針函數(shù): 顧名思義国夜,它的本質(zhì)是一個(gè)函數(shù),不過它的返回值是一個(gè)指針短绸。
// 指針函數(shù)
int *sum(int a, int b){
    int result = a + b;
    int *c = &result;
    return c;
}
int *p = sum(10, 20);
printf("sum:%d\n", *p);

函數(shù)指針

  • 與指針函數(shù)不同车吹,函數(shù)指針 的本質(zhì)是一個(gè)指針筹裕,該指針的地址指向了一個(gè)函數(shù),所以它是指向函數(shù)的指針窄驹。
// 函數(shù)指針
int max(int a, int b){
    return (a > b)?a:b;
}
int (*p)(int, int) = max;
int result = p(10, 20);
printf("result:%d\n", result);

56.寫一個(gè)標(biāo)準(zhǔn)的宏MAX,這個(gè)宏輸入2個(gè)參數(shù),返回最大一個(gè)

#define Max(a,b) a>b?a:b

57.自定義宏 #define MIN(A,B) A<B?A:B 代碼運(yùn)行結(jié)果?

float a = 1;
float b = MIN(a++,1.5);
問 a= ? b = ?
答案: a = 3; b = 2
a++ 會(huì)后執(zhí)行, a++在表達(dá)式出現(xiàn)了2次,得3,  a++<1.5,返回a++,得2

// 擴(kuò)展
float a = 1;
float b = [self getMax:a++ b:1.5];
- (CGFloat)getMax:(CGFloat ) a b:(CGFloat)b{
   return a>b?a:b;
}
運(yùn)行 a = 2; b =1.5;

收錄 | 原文地址

結(jié)語(yǔ)

再次說一聲朝卒,對(duì)于答案,不一定都合適乐埠,歡迎大家積極討論抗斤;整理不易,如果您覺得還不錯(cuò)丈咐,麻煩在文末 “點(diǎn)個(gè)贊” 瑞眼,或者留下您的評(píng)論“Mark” 一下,謝謝您的支持


推薦文集

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棵逊,一起剝皮案震驚了整個(gè)濱河市负拟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歹河,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件花吟,死亡現(xiàn)場(chǎng)離奇詭異秸歧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)衅澈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門键菱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人今布,你說我怎么就攤上這事经备。” “怎么了部默?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵侵蒙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我傅蹂,道長(zhǎng)纷闺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任份蝴,我火速辦了婚禮犁功,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘婚夫。我一直安慰自己浸卦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布案糙。 她就那樣靜靜地躺著限嫌,像睡著了一般靴庆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萤皂,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天撒穷,我揣著相機(jī)與錄音,去河邊找鬼裆熙。 笑死端礼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的入录。 我是一名探鬼主播蛤奥,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼僚稿!你這毒婦竟也來了凡桥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蚀同,失蹤者是張志新(化名)和其女友劉穎缅刽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蠢络,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衰猛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刹孔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啡省。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖髓霞,靈堂內(nèi)的尸體忽然破棺而出卦睹,到底是詐尸還是另有隱情,我是刑警寧澤方库,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布结序,位于F島的核電站,受9級(jí)特大地震影響纵潦,放射性物質(zhì)發(fā)生泄漏笼痹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一酪穿、第九天 我趴在偏房一處隱蔽的房頂上張望凳干。 院中可真熱鬧,春花似錦被济、人聲如沸救赐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)经磅。三九已至泌绣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間预厌,已是汗流浹背阿迈。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轧叽,地道東北人苗沧。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像炭晒,于是被迫代替她去往敵國(guó)和親待逞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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