面試題

1、基礎(chǔ)數(shù)據(jù)類型


image.png

image.png

2、關(guān)鍵字


image.png

3、strong、weak、assign、copy 區(qū)別
1、 strong 修飾符表示指向并持有該對象、引用計數(shù)會+1 (可變數(shù)組\字典)
2、weak 修飾符表示指向并不持有該對、引用計數(shù)不會+1,weak不可以修飾基本數(shù)據(jù)類型 (多用于避免循環(huán)引用的地方)(Delegate)
3、assign 主要用于修飾基本數(shù)據(jù)類型;(Int等)
4、copy多用于修飾有可變類型的不可變對象上 (不可變數(shù)組\字典)

1、對于不可變對象來說:retain、strong、copy三者的作用是一樣的,即當引用的原對象值改變后,其他引用該對象的屬性值不會受影響,還是保持原來的值;

2、對于可變對象來說:retain、strong和copy的作用就有區(qū)別了,使用retain、strong修飾的屬性,當引用的原對象值改變后,其他引用該對象的屬性值會一起跟著變化,而copy修飾的屬性的值還是保持原樣。copy的作用主要也是體現(xiàn)在這里: 讓屬性值不會隨著原引用對象的值改變而改變;

3、retain和strong的區(qū)別:作用是一樣的,只是寫法上的區(qū)別。在非arc機制時,是用retain關(guān)鍵字修飾;在arc機制后,一般都用strong關(guān)鍵字來代替retain了

4、根本原因是:給字符串屬性賦值不可變字符串,retain、strong、copy修飾的可變和不可變字符串屬性都是指針拷貝;
5、給字符串屬性賦值可變字符串,retain、strong修飾的可變和不可變字符串屬性是指針拷貝,而copy修飾的可變和不可變字符串屬性都是內(nèi)容拷貝。
1 深復制:內(nèi)容拷貝,源對象和副本對象指的是兩個不同的對象,源對象引用計數(shù)器不變,副本對象引用計數(shù)器為1, 相當于copy(只有不可變對象創(chuàng)建不可變副本(copy)才是淺復制,其它的都是深復制)
2 淺復制:指針拷貝,源對象和副本對象指的都是同一個對象,對象引用計數(shù)器+1,相當于retain
結(jié)論:


image.png

1、 實例對象 類對象 元類對象

2、objc_msgSend消息執(zhí)行流程
1)消息發(fā)送(cache緩存查找 ->class_rw_t查找 ->父類查找)
2)動態(tài)方法解析(resolveInstanceMethod方法)
3)消息轉(zhuǎn)發(fā)(forwardingTargetForSelector方法-> methodSignatureForSelector(方法簽名)-> forwardInvocation )

3、interface 和 implementation
@interface...@end :可以理解為相當于c++中類的變量和方法的聲明

@implementation...@end :可以理解為相當于c++中類的方法的實現(xiàn)

4、instancetype說明
instancetype是clang 3.5開始提供的一個關(guān)鍵字,跟id類似,用于表示某個方法返回的未知類型的Objective-C對象。

5、associatedtype 協(xié)議關(guān)聯(lián)類型(協(xié)議泛型)
6、typealias 用來給類型起別名
7、使用some關(guān)鍵字聲明一個不透明類型(只能返回一種類型)

8、designated、convenience、required
1、designated(中文含義:指定的) :它指的是我們定義的公開的構(gòu)造函數(shù);公開的構(gòu)造函數(shù)至少有一個,也可以有多個;
2、convenience(中文含義:便利的):我們可以用該關(guān)鍵字來擴展(即新增)構(gòu)造函數(shù),因此是修飾構(gòu)造函數(shù)的,但需要注意幾點:
必需在同一個類中使用;
必需調(diào)用一個 designated 構(gòu)造函數(shù),調(diào)用時使用的是 self.init,而不是 super.init;
子類無法繼承重載被 convenience 修飾的構(gòu)造方法;
3、required(中文含義:必要的) :含義很直白,即子類必需要實現(xiàn)父類指定的構(gòu)造函數(shù);

8、String 16個字節(jié)
少于16個字節(jié) 存放實際字符串值(內(nèi)存)
大于16個字節(jié) 后8個字節(jié)存放真是字符串地址(常量區(qū))常量區(qū)一般放字符串
改變(apped) 開辟堆空間(堆空間)

9、Array 8個字 存放地址值(堆空間)

6、分類(category),類擴展(interface)
'分類'(Category)是OC中的特有語法,它是表示一個指向分類的結(jié)構(gòu)體的指針。原則上它只能增加方法,不能增加成員(實例)變量(沒有屬性列表)。
分類可以利用 關(guān)聯(lián)對象(AssociatedObject)添加屬性(寫屬性的set get 方法)
f
Category源碼:

Category
Category 是表示一個指向分類的結(jié)構(gòu)體的指針,其定義如下:
typedef struct objc_category *Category;
struct objc_category {
  char *category_name                          OBJC2_UNAVAILABLE; // 分類名
  char *class_name                             OBJC2_UNAVAILABLE; // 分類所屬的類名
  struct objc_method_list *instance_methods    OBJC2_UNAVAILABLE; // 實例方法列表
  struct objc_method_list *class_methods       OBJC2_UNAVAILABLE; // 類方法列表
  struct objc_protocol_list *protocols         OBJC2_UNAVAILABLE; // 分類所實現(xiàn)的協(xié)議列表
}

@interface XXX ()
//私有屬性
//私有方法(如果不實現(xiàn),編譯時會報警,Method definition for 'XXX' not found)
@end

區(qū)別
①類別中原則上只能增加方法(能添加屬性的的原因只是通過runtime解決無setter/getter的問題而已);
②類擴展不僅可以增加方法,還可以增加實例變量(或者屬性),只是該實例變量默認是@private類型的(
用范圍只能在自身類,而不是子類或其他地方);
③類擴展中聲明的方法沒被實現(xiàn),編譯器會報警,但是類別中的方法沒被實現(xiàn)編譯器是不會有任何警告的。這是因為類擴展是在編譯階段被添加到類中,而類別是在運行時添加到類中。
④類擴展不能像類別那樣擁有獨立的實現(xiàn)部分(@implementation部分),也就是說,類擴展所聲明的方法必須依托對應類的實現(xiàn)部分來實現(xiàn)。
⑤定義在 .m 文件中的類擴展方法為私有的,定義在 .h 文件(頭文件)中的類擴展方法為公有的。類擴展是在 .m 文件中聲明私有方法的非常好的方式。

6、isKindOfClass (是否是這種類型 或者這種類型的子類)
isMemberOfClass

10、死鎖
同一個串行隊列,執(zhí)行 添加 同步任務
sync函數(shù) 往當前SERIAL串行隊列添加任務


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容