OC語言特性面試知識

一、分類(category)

1、在開發過程中分類都可以做哪些事情?
a、聲明私有方法。
b、分解體積龐大的類文件。
c、把Framework的私有方法公開化。

2、分類的特點:
a、在運行時決議(在運行時候通過runloop添加到相應的數組類中,這是它最大的特點,這是分類和擴展最大區別)
b、可以為系統類添加分類。
3、分類中可以添加哪些內容
a、可以添加實例方法
b、類方法
c、協議
d、屬性(在分類中添加屬性只是申明了get/set方法并沒有為分類添加實例變量)
分類可以通過關聯對象添加實例變量。

二、關聯對象

1、 能否給分類添加“成員變量”?
能,可以通過關聯對象技術來實現分類關聯對象。
2、關聯對象的方法


image.png

3、怎樣清楚某一個關聯對象的關聯值?
setObjectValue傳值為nil

三、擴展

1、一般用擴展來做什么?
a、聲明私有屬性
b、聲明私有方法
c、聲明私有成員變量
2、分類、擴展的區別?
擴展的特點:a、編譯時決議
b、只以聲明的形式存在,多數情況下寄生于宿主類的.m
c、不能為系統添加擴展

分類的特點:
a、在運行時決議(在運行時候通過runloop添加到相應的數組類中,這是它最大的特點,這是分類和擴展最大區別)
b、可以為系統類添加分類。
c、分類有聲明和實現.

四、代理

1、什么是代理
a、它是一種軟件設計模式(代理模式)
b、iOS當中以@protocol形式體現
c、它的傳遞方式是一對一的。(這是代理跟通知的最大區別,通知是一對多傳遞方式)
2、代理的工作流程


image.png

3、代理協議可以定義哪些內容?
a、可以定義代理方法
b、可以定義成員屬性
4、代理協議里面聲明的方法或屬性代理方必須都要實現嗎?
不一定,要看具體情況。例如:對于協議中申明是@optional就不是必需要,但對于@required必須要實現
5、代理方、委托方以什么方式存在?
一般在委托方聲明為weak以規避循環引用。


image.png

五、通知(NSNotification)

1、通知的特點:
a、是使用觀察者模式來實現的用于跨層傳遞消息機制。
b、傳遞方式為一對多。
2、代理和通知區別
a、代理是用代理模式實現的,通知是用觀察者模式實現
b、代理傳遞方式是一對一,通知是一對多。
3、如何實現通知機制?
在通知中心有一個Map表它key是notifactionName 它的Value是 Observers_list,在Observers_list數據中每一個成員應該首先包括通知接受的觀察者,其次包含這個觀察者調用的方法,以及收到通知之后觀察者的回調方法。

六、KVO

1、什么是kvo
a、 kvo是key-value observing的縮寫,它是OC對觀察者模式的又一實現。
b、APPle使用了isa混寫(isa-swizzling)來實現kvo

isa混寫技術在kvo中是怎樣實現的?
當我們注冊一個觀察者A時候,實際上是調用了系統oberserver: forKeyPath:時,系統會為我們在運行時動態將A這個類的isa指針地址指向NSKVONotfying_A。同時重寫setter方法


image.png
系統在運行時候動態為我們創建了一個子類,改寫isa指向同時重寫setter方法。來實現kvo的機制

2、通過kvc設置value,kvo是否生效?
能生效。
為什么能生效?kvc調用setValue:forkey:調用最終會調用到kvo的setter方法
3、通過成員變量直接賦值,kvo是否生效?
不能生效。但是可以通過手動設置kvo,在直接賦值之前調用willChangeValueforKey:,在賦值之后調用didChangeValueforKey:;kvo就能生效


image.png

六、KVC

1、什么是kvc
是蘋果系統為我們提供一種鍵值編碼技術

-(id)valueForKey:(NSString*)key 通過這個方法可以獲取跟key同名或者相似名稱的實例變量的值
-(id)setValue:(id)value forKey:(NSString*)key 通過這個方法可以設置某一對象中和這個key同名或者相似名稱實例變量的值

2、通過kvc(鍵值編碼技術)是否違背了面向對象思想?

七、屬性關鍵字

1、屬性關鍵可以分類哪幾類?
a、讀寫權限: readolny readwrite
b、原子性:atomic(它可以保證屬性賦值、獲取是線程安全的)、nonatomic
c、引用計數:retain/strong,assign/unsafe_unretained 、weak、copy

2、assin
a、修飾基本數據類型,比如:int、Bool等
b、修飾對象時,不改變其引用計數。
c、會產生懸垂指針。(它所修飾對象在被釋放之后 仍指向原來地址不沒有立即設置為nil,當再次用它修飾時候會造成內存泄露)
3、weak
a、不改變被修飾對象引用計數。
b、它所指對象在被釋放之后會自動置nil.
4、copy
a、淺拷貝
淺拷貝只是對內存地址的復制,讓目標對象指針跟原對象指針指向同一個內存地址。它會增加被對象的引用計數
b、深拷貝
目標對象指針和原對象指針指向兩片內容相同的內存地址空間。
它不會增加被拷貝的引用計數,產生了內存分配。

image.png

image.png

@property(copy)NSMutableArray* array?
聲明這樣一個屬性會導致程序一些不可以預測性
1、如果賦值過來的是NSmutableArray,通過copy之后就是NSArray
2、如果賦值過來的是NSArray,通過copy之后就是NSArray
由于原來這個這個屬性聲明是可變對象,但是拷貝過來對象是不可變對象,

?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 通過這篇文章要了解的面試問題 請簡述分類實現原理 KVO的實現原理是怎樣的 能否為分類添加成員變量 目錄 分類 &...
    PetitBread閱讀 782評論 2 4
  • 一、分類 1、你用分類都做了哪些事?(1)、聲明私有方法(2)、分解體積龐大的類文件(3)、把Framework的...
    騎著毛驢走起來閱讀 549評論 0 2
  • 久違的晴天,家長會。 家長大會開好到教室時,離放學已經沒多少時間了。班主任說已經安排了三個家長分享經驗。 放學鈴聲...
    飄雪兒5閱讀 7,550評論 16 22
  • 今天感恩節哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會,身份的轉變要...
    迷月閃星情閱讀 10,602評論 0 11
  • 可愛進取,孤獨成精。努力飛翔,天堂翱翔。戰爭美好,孤獨進取。膽大飛翔,成就輝煌。努力進取,遙望,和諧家園。可愛游走...
    趙原野閱讀 2,760評論 1 1