iOS開發(fā)閱讀 - Objective-C系列(1)

iOS開發(fā)閱讀 - Objective-C系列(目錄)

class 舱禽,struct與object

class是類,struct是結(jié)構(gòu)體。
什么是類?具有相同特性(數(shù)據(jù)元素)和行為(功能)的對象的抽象就是類下翎。類是一種抽象的數(shù)據(jù)類型,為所有的對象定義了抽象的屬性與行為宝当。類具有屬性,它是對象的狀態(tài)的抽象胆萧,用數(shù)據(jù)結(jié)構(gòu)來描述類的屬性庆揩。類具有操作,它是對象的行為的抽象跌穗,用操作名和實現(xiàn)該操作的方法來描述订晌。
什么是結(jié)構(gòu)體?由一系列具有相同類型或不同類型的數(shù)據(jù)構(gòu)成的數(shù)據(jù)集合蚌吸,叫做結(jié)構(gòu)锈拨。結(jié)構(gòu)被用來代表一個記錄,比如一本書羹唠,有標(biāo)題奕枢,作者娄昆, 主題,圖書ID缝彬,這就是一個結(jié)構(gòu)萌焰。
而在Objective-C中,類在Objective-C中是objc_class 結(jié)構(gòu)體指針谷浅。

typedef struct objc_class *Class; 

objc/runtime.hobjc_class結(jié)構(gòu)體的定義如下:

struct objc_class {  
    Class isa  OBJC_ISA_AVAILABILITY;  
  
#if !__OBJC2__  
    Class super_class                                        OBJC2_UNAVAILABLE;  
    const charchar *name                                         OBJC2_UNAVAILABLE;  
    long version                                             OBJC2_UNAVAILABLE;  
    long info                                                OBJC2_UNAVAILABLE;  
    long instance_size                                       OBJC2_UNAVAILABLE;  
    struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;  
    struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;  
    struct objc_cache *cache                                 OBJC2_UNAVAILABLE;  
    struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;  
#endif  
  
} OBJC2_UNAVAILABLE; 

isa: 指向元類的objc_class結(jié)構(gòu)體指針扒俯,iOS中的類也是對象,元類中儲存有類對象的類方法一疯;
superclass: 指向父類的objc_class結(jié)構(gòu)體指針撼玄,如果該類已經(jīng)是最頂層的根類(如NSObjectNSProxy)掌猛,則superclassNULL磕蒲,可以通過父類的指針找到變量和方法留潦;
name:類名;
version:版本號辣往,默認(rèn)為0
info:其他信息兔院,運行期間的一些位標(biāo)示
instance_size:類實例變量大小
ivars: 該類的成員變量鏈表,是objc_ivar_list結(jié)構(gòu)體指針

struct objc_ivar_list {    
    int ivar_count;    
    /* variable length structure */    
    struct objc_ivar ivar_list[1];    
}  

objc_var:變量結(jié)構(gòu)體---名稱站削,類型坊萝,偏移字節(jié)和占用的空間

struct objc_ivar {  
    charchar *ivar_name                                          OBJC2_UNAVAILABLE;  
    charchar *ivar_type                                          OBJC2_UNAVAILABLE;  
    int ivar_offset                                          OBJC2_UNAVAILABLE;  
#ifdef __LP64__  
    int space                                                OBJC2_UNAVAILABLE;  
#endif  
}

objc_method_list: 方法鏈表結(jié)構(gòu)體

struct objc_method_list {  
    struct objc_method_list *obsolete                        OBJC2_UNAVAILABLE;   
  
    int method_count                                         OBJC2_UNAVAILABLE;  
#ifdef __LP64__  
    int space                                                OBJC2_UNAVAILABLE;  
#endif  
    /* variable length structure */  
    struct objc_method method_list[1]                        OBJC2_UNAVAILABLE;  
}   

method: 對象的每個方法的結(jié)構(gòu)體,SEL是方法選擇器许起,是hash后的值园细,是一個字符串惦积,可以很快地通過這個值找到函數(shù)體的實現(xiàn),IMP 是函數(shù)指針

struct objc_method {  
    SEL method_name                                          OBJC2_UNAVAILABLE;  
    charchar *method_types                                       OBJC2_UNAVAILABLE;  
    IMP method_imp                                           OBJC2_UNAVAILABLE;  
}

cache: 對象使用過的方法鏈表

struct objc_cache {  
    unsigned int mask /* total = mask + 1 */                 OBJC2_UNAVAILABLE;  
    unsigned int occupied                                    OBJC2_UNAVAILABLE;  
    Method buckets[1]                                        OBJC2_UNAVAILABLE;  
};

protocols:協(xié)議鏈表

struct objc_protocol_list {  
    struct objc_protocol_list *next;  
    long count;  
    Protocol *list[1];  
};

objc_class的定義中猛频,在使用runtime以class為前綴的方法時狮崩,主要就是針對這個struct中的各個字段的。

isa指針

在OC中所有的類其實也是一個對象毡熏,那么這個對象也會有一個所屬的類坦敌,這個類就是元類也就是結(jié)構(gòu)體里面isa指針?biāo)傅念悺?元類的定義:元類就是類對象的類。每個類都有自己的元類,因為每個類都有自己獨一無二的方法狱窘。)
1.對象的isa指針指向所屬的類
2.類的isa指針指向了所屬的元類
3.元類的isa指向了根元類杜顺,根元類指向了自己。
有這樣一幅圖展示這樣一種關(guān)系:


1773988-f3b90f8a4d90e32b.png.jpeg

成員變量(ivars)及屬性

objc_class中训柴,所有的成員變量哑舒、屬性的信息是放在鏈表ivars中的。ivars是一個數(shù)組幻馁,數(shù)組中每個元素是指向Ivar(變量信息)的指針洗鸵。runtime提供了豐富的函數(shù)來操作這一字段。大體上可以分為以下幾類:
1.成員變量操作函數(shù):

// 獲取類中指定名稱實例成員變量的信息
Ivar class_getInstanceVariable ( Class cls, const char *name );

// 獲取類成員變量的信息
Ivar class_getClassVariable ( Class cls, const char *name );

// 添加成員變量
BOOL class_addIvar ( Class cls, const char *name, size_t size, uint8_t alignment, const char *types );

// 獲取整個成員變量列表
Ivar * class_copyIvarList ( Class cls, unsigned int *outCount );

Objective-C不支持往已存在的類中添加實例變量仗嗦,可以通過runtime class_addIvar函數(shù)來添加,只能在objc_allocateClassPairobjc_registerClassPair之間調(diào)用膘滨。
另外,這個類也不能是元類稀拐。成員變量的按字節(jié)最小對齊量是1<<alignment火邓。這取決于ivar的類型和機器的架構(gòu)。如果變量的類型是指針類型德撬,則傳遞log2(sizeof(pointer_type))铲咨。
2.屬性操作函數(shù)

// 獲取指定的屬性
objc_property_t class_getProperty ( Class cls, const char *name );

// 獲取屬性列表
objc_property_t * class_copyPropertyList ( Class cls, unsigned int *outCount );

// 為類添加屬性
BOOL class_addProperty ( Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount );

// 替換類的屬性
void class_replaceProperty ( Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount );

methodLists方法

objc_method_list方法鏈表中存放的是該類的成員方法

// 添加方法
BOOL class_addMethod ( Class cls, SEL name, IMP imp, const char *types );

// 獲取實例方法
Method class_getInstanceMethod ( Class cls, SEL name );

// 獲取類方法
Method class_getClassMethod ( Class cls, SEL name );

// 獲取所有方法的數(shù)組
Method * class_copyMethodList ( Class cls, unsigned int *outCount );

// 替代方法的實現(xiàn)
IMP class_replaceMethod ( Class cls, SEL name, IMP imp, const char *types );

// 返回方法的具體實現(xiàn)
IMP class_getMethodImplementation ( Class cls, SEL name );

IMP class_getMethodImplementation_stret ( Class cls, SEL name );

// 類實例是否響應(yīng)指定的selector
BOOL class_respondsToSelector ( Class cls, SEL sel );

類與結(jié)構(gòu)體的主要區(qū)別是structValue Type,就是值類型, classReference Type蜓洪,是引用類型纤勒。(在swift里,要想用它的方法修改屬性數(shù)據(jù)隆檀,就必須在方法前面加上mutating關(guān)鍵詞摇天。結(jié)構(gòu)體和枚舉都是值類型的,默認(rèn)情況下恐仑,值類型的屬性是不能從它的實例方法內(nèi)部改變的泉坐。如果想要在實例方法里面修改結(jié)構(gòu)體或者枚舉的屬性值的話,就需要使用mutating關(guān)鍵詞特殊處理裳仆。帶有mutating關(guān)鍵詞標(biāo)志的方法腕让,可以在方法內(nèi)部修改這些值,并且方法返回后還有效歧斟,class沒有這個限制记某。)

對象是啥?

對象其實就是實例化的類构捡。
對象是一種結(jié)構(gòu),它包含值和指向其類的隱藏指針壳猜」椿眨“實例”是對象的另一種稱呼,例如统扳,Circle對象也可以稱呼為Circle類的實例喘帚。
編寫面向?qū)ο蟮某绦驎r畅姊,你所創(chuàng)建的類和對象之間存在一定的關(guān)系,它們協(xié)同工作才能實現(xiàn)程序的相應(yīng)功能吹由。
處理類和對象之間的關(guān)系若未,尤其要重視OOP的兩個方面。第一個方面是繼承倾鲫。創(chuàng)建一個新類時粗合,通常需要定義新類以區(qū)別于其他類及現(xiàn)有類。使用繼承可以定義一個具有父類所有功能的新類乌昔,它繼承了父類的這些功能隙疚。你也可以添加額外的方法以及重寫現(xiàn)有的方法來達(dá)到你所要實現(xiàn)的功能。
另一個和類有關(guān)的OOP技術(shù)是復(fù)合(composition)磕道。在復(fù)合中供屉,對象可以引用其他對象,可以利用其他對象提供的特性溺蕉,這就是復(fù)合伶丐。復(fù)合是通過包含作為實例變量的指針實現(xiàn)的。
嚴(yán)格的講疯特,只有對象間的組合才能叫做復(fù)合哗魂,諸如int、float辙芍、enum和struct等基本類型都被認(rèn)為是對象的一部分啡彬。

剛才是主要介紹了iOS的類,結(jié)構(gòu)體故硅,對象的關(guān)系庶灿。在實際應(yīng)用過程中,我們可能會對某個類增加方法或者變量吃衅。
這時我們就要知道分類CategoryExtension往踢。

Category和Extension

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市徘层,隨后出現(xiàn)的幾起案子峻呕,更是在濱河造成了極大的恐慌,老刑警劉巖趣效,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘦癌,死亡現(xiàn)場離奇詭異,居然都是意外死亡跷敬,警方通過查閱死者的電腦和手機讯私,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斤寇,你說我怎么就攤上這事桶癣。” “怎么了娘锁?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵牙寞,是天一觀的道長。 經(jīng)常有香客問我莫秆,道長间雀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任馏锡,我火速辦了婚禮雷蹂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杯道。我一直安慰自己匪煌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布党巾。 她就那樣靜靜地躺著萎庭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪齿拂。 梳的紋絲不亂的頭發(fā)上驳规,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音署海,去河邊找鬼吗购。 笑死,一個胖子當(dāng)著我的面吹牛砸狞,可吹牛的內(nèi)容都是我干的捻勉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼刀森,長吁一口氣:“原來是場噩夢啊……” “哼踱启!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起研底,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤埠偿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后榜晦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冠蒋,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年乾胶,在試婚紗的時候發(fā)現(xiàn)自己被綠了浊服。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片统屈。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖牙躺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腕扶,我是刑警寧澤孽拷,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站半抱,受9級特大地震影響脓恕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窿侈,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一炼幔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧史简,春花似錦乃秀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至殉农,卻和暖如春刀脏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背超凳。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工愈污, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人轮傍。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓暂雹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親金麸。 傳聞我的和親對象是個殘疾皇子擎析,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355