1、基礎數(shù)據(jù)類型
2聋呢、關鍵字
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關鍵字修飾;在arc機制后龙宏,一般都用strong關鍵字來代替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
結論:
1今布、 實例對象 類對象 元類對象
2经备、objc_msgSend消息執(zhí)行流程
1)消息發(fā)送(cache緩存查找 ->class_rw_t查找 ->父類查找)
2)動態(tài)方法解析(resolveInstanceMethod方法)
3)消息轉發(fā)(forwardingTargetForSelector方法-> methodSignatureForSelector(方法簽名)-> forwardInvocation )
3、interface 和 implementation
@interface...@end :可以理解為相當于c++中類的變量和方法的聲明
@implementation...@end :可以理解為相當于c++中類的方法的實現(xiàn)
4部默、instancetype說明
instancetype是clang 3.5開始提供的一個關鍵字侵蒙,跟id類似,用于表示某個方法返回的未知類型的Objective-C對象傅蹂。
5纷闺、associatedtype 協(xié)議關聯(lián)類型(協(xié)議泛型)
6、typealias 用來給類型起別名
7份蝴、使用some關鍵字聲明一個不透明類型(只能返回一種類型)
8犁功、designated、convenience婚夫、required
1浸卦、designated(中文含義:指定的) :它指的是我們定義的公開的構造函數(shù);公開的構造函數(shù)至少有一個案糙,也可以有多個限嫌;
2、convenience(中文含義:便利的):我們可以用該關鍵字來擴展(即新增)構造函數(shù)时捌,因此是修飾構造函數(shù)的怒医,但需要注意幾點:
必需在同一個類中使用;
必需調(diào)用一個 designated 構造函數(shù)奢讨,調(diào)用時使用的是 self.init稚叹,而不是 super.init;
子類無法繼承重載被 convenience 修飾的構造方法拿诸;
3入录、required(中文含義:必要的) :含義很直白,即子類必需要實現(xiàn)父類指定的構造函數(shù)佳镜;
8僚稿、String 16個字節(jié)
少于16個字節(jié) 存放實際字符串值(內(nèi)存)
大于16個字節(jié) 后8個字節(jié)存放真是字符串地址(常量區(qū))常量區(qū)一般放字符串
改變(apped) 開辟堆空間(堆空間)
9、Array 8個字 存放地址值(堆空間)
6蟀伸、分類(category),類擴展(interface)
'分類'(Category)是OC中的特有語法蚀同,它是表示一個指向分類的結構體的指針。原則上它只能增加方法啊掏,不能增加成員(實例)變量(沒有屬性列表)蠢络。
分類可以利用 關聯(lián)對象(AssociatedObject)添加屬性(寫屬性的set get 方法)
f
Category源碼:
Category
Category 是表示一個指向分類的結構體的指針,其定義如下:
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串行隊列添加任務