欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報激活碼778899分享:ios objc

柚子快報激活碼778899分享:ios objc

http://yzkb.51969.com/

入門

在 Objective-C 中,objc_object 和 objc_class 是運行時系統(tǒng)的核心結構,用于表示對象和類。理解它們的結構和關系對于掌握 Objective-C 的運行時機制非常重要。

objc_object 結構

objc_object 結構代表一個 Objective-C 對象。每個 Objective-C 對象都有一個 isa 指針,指向它的類對象。

objc_object 結構示例

struct objc_object {

Class isa; // isa 指針,指向類對象

};

isa:這是一個指向類對象的指針,通過它可以找到對象所屬的類及其方法和其他元數(shù)據(jù)。

objc_class 結構

objc_class 結構代表一個類對象。類對象本質(zhì)上也是對象,因此它也有一個 isa 指針,指向它的元類(meta-class)。此外,objc_class 結構還包含了有關類的其他信息,如方法列表、成員變量、協(xié)議等。

objc_class 結構示例

struct objc_class {

Class isa; // isa 指針,指向元類對象

Class super_class; // 指向父類對象

const char *name; // 類的名稱

long version; // 類的版本信息

long info; // 類的信息標志位

long instance_size; // 實例的大小

struct objc_ivar_list *ivars; // 成員變量列表

struct objc_method_list **methodLists; // 方法列表數(shù)組

struct objc_cache *cache; // 方法緩存

struct objc_protocol_list *protocols; // 協(xié)議列表

};

objc_class 結構字段解釋

isa:指向元類對象的指針。元類對象包含類方法和元類的元數(shù)據(jù)。super_class:指向父類對象的指針。實現(xiàn)繼承鏈。name:類的名稱。version:類的版本信息。info:類的信息標志位,包含一些布爾值標志。instance_size:實例的大小,表示分配對象內(nèi)存時需要的大小。ivars:成員變量列表,指向類的成員變量列表。methodLists:方法列表數(shù)組,指向類的方法列表。cache:方法緩存,指向方法調(diào)用的緩存。protocols:協(xié)議列表,指向類實現(xiàn)的協(xié)議列表。

objc_class 和 objc_object 的關系

在 Objective-C 中,類本身也是對象。這意味著 objc_class 結構是 objc_object 結構的一個子類。每個類對象都有一個 isa 指針,指向其元類對象。元類對象也有一個 isa 指針,指向根元類對象。

類和元類關系圖

+--------------------+ +--------------------+ +--------------------+

| 實例對象 | --> | 類對象 | --> | 元類對象 |

+--------------------+ +--------------------+ +--------------------+

| isa -> Class | | isa -> MetaClass | | isa -> RootMetaClass|

+--------------------+ +--------------------+ +--------------------+

| | | super_class | | super_class |

+--------------------+ +--------------------+ +--------------------+

實例對象 的 isa 指針指向類對象。類對象 的 isa 指針指向元類對象。元類對象 的 isa 指針指向根元類對象。

具體示例

以下是一個具體示例,展示如何使用 objc_object 和 objc_class 結構:

#import

#import

@interface MyClass : NSObject

@end

@implementation MyClass

@end

int main(int argc, const char * argv[]) {

@autoreleasepool {

MyClass *obj = [[MyClass alloc] init];

Class objClass = object_getClass(obj);

Class objMetaClass = object_getClass(objClass);

NSLog(@"Instance: %p", obj);

NSLog(@"Class: %p", objClass);

NSLog(@"MetaClass: %p", objMetaClass);

NSLog(@"Instance isa: %p", *(uintptr_t *)obj);

NSLog(@"Class isa: %p", *(uintptr_t *)objClass);

NSLog(@"MetaClass isa: %p", *(uintptr_t *)objMetaClass);

}

return 0;

}

在這個示例中,我們使用 object_getClass 函數(shù)獲取對象的類和元類,然后打印它們的內(nèi)存地址和 isa 指針。輸出結果顯示了對象、類和元類之間的關系。

小結

objc_object:表示一個 Objective-C 對象,包含一個 isa 指針,指向類對象。objc_class:表示一個類對象,包含 isa 指針、父類指針、方法列表、成員變量等信息。類和元類:類對象也是對象,isa 指針指向元類對象,元類對象的 isa 指針指向根元類對象。

理解 objc_object 和 objc_class 的結構及其關系,有助于深入掌握 Objective-C 的運行時機制和面向?qū)ο缶幊棠P汀?/p>

拓展

objc_object 結構代表一個 Objective-C 對象,objc_class 結構代表一個類對象,那么什么結構代表元類對象 ?什么結構代表根元類對象 ?

在 Objective-C 中,類對象和元類對象實際上使用相同的結構體,即 objc_class 結構體。元類對象是特殊的類對象,用于存儲類方法。當一個類對象調(diào)用類方法時,這個調(diào)用實際上是通過它的元類對象實現(xiàn)的。

類對象、元類對象和根元類對象

類對象:用于存儲實例方法和實例變量。元類對象:用于存儲類方法。每個類對象都有一個對應的元類對象。根元類對象:所有元類的終極元類,通常是 NSObject 的元類。

objc_class 結構體

objc_class 結構體同時表示類對象和元類對象。以下是 objc_class 結構體的定義:

struct objc_class {

Class isa; // 指向元類對象

Class super_class; // 指向父類對象或父元類對象

const char *name; // 類的名稱

long version; // 類的版本信息

long info; // 類的信息標志位

long instance_size; // 實例的大小

struct objc_ivar_list *ivars; // 成員變量列表

struct objc_method_list **methodLists; // 方法列表數(shù)組

struct objc_cache *cache; // 方法緩存

struct objc_protocol_list *protocols; // 協(xié)議列表

};

類對象和元類對象之間的關系

每個類對象都有一個 isa 指針,指向其元類對象。元類對象的 isa 指針指向根元類對象。根元類對象 (通常是 NSObject 的元類) 的 isa 指針指向自己,這構成了一個循環(huán),表示類對象體系的終點。

元類對象和根元類對象的關系圖

+-------------------+ +-------------------+ +-------------------+

| 實例對象 | --> | 類對象 | --> | 元類對象 |

+-------------------+ +-------------------+ +-------------------+

| isa -> Class | | isa -> MetaClass | | isa -> RootMetaClass|

+-------------------+ +-------------------+ +-------------------+

| | | super_class | | super_class |

+-------------------+ +-------------------+ +-------------------+

具體的例子

假設我們有一個類 MyClass,它繼承自 NSObject,我們可以構造以下關系:

@interface MyClass : NSObject

@end

@implementation MyClass

@end

在內(nèi)存中的關系可以表示為:

MyClass instance -> MyClass -> MyClass's MetaClass -> NSObject's MetaClass -> NSObject's MetaClass (itself)

代碼示例

下面的代碼展示了如何獲取和打印類對象和元類對象的信息:

#import

#import

@interface MyClass : NSObject

@end

@implementation MyClass

@end

int main(int argc, const char * argv[]) {

@autoreleasepool {

MyClass *obj = [[MyClass alloc] init];

Class objClass = object_getClass(obj); // 獲取類對象

Class objMetaClass = object_getClass(objClass); // 獲取元類對象

Class rootMetaClass = object_getClass(objMetaClass); // 獲取根元類對象

NSLog(@"Instance: %p", obj);

NSLog(@"Class: %p", objClass);

NSLog(@"MetaClass: %p", objMetaClass);

NSLog(@"RootMetaClass: %p", rootMetaClass);

NSLog(@"Instance isa: %p", *(uintptr_t *)obj);

NSLog(@"Class isa: %p", *(uintptr_t *)objClass);

NSLog(@"MetaClass isa: %p", *(uintptr_t *)objMetaClass);

NSLog(@"RootMetaClass isa: %p", *(uintptr_t *)rootMetaClass);

}

return 0;

}

輸出結果

運行上面的代碼,輸出結果可能如下:

Instance: 0x600003b7a0c0

Class: 0x10f512340

MetaClass: 0x10f512370

RootMetaClass: 0x10f512370

Instance isa: 0x10f512340

Class isa: 0x10f512370

MetaClass isa: 0x10f512370

RootMetaClass isa: 0x10f512370

在這個示例中,我們看到:

實例對象的 isa 指針指向類對象。類對象的 isa 指針指向元類對象。元類對象的 isa 指針指向根元類對象。根元類對象的 isa 指針指向自己。

總結

objc_object:表示一個實例對象,包含一個 isa 指針,指向類對象。objc_class:表示一個類對象,包含 isa 指針、父類指針、方法列表等信息。類對象和元類對象使用相同的結構體。元類對象:也是 objc_class 結構體,isa 指針指向根元類對象。根元類對象:isa 指針指向自己,終結了類對象體系的循環(huán)。

理解這些結構和關系對于掌握 Objective-C 運行時的動態(tài)特性和面向?qū)ο缶幊棠P头浅V匾?/p>

柚子快報激活碼778899分享:ios objc

http://yzkb.51969.com/

好文閱讀

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

轉(zhuǎn)載請注明,如有侵權,聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19504619.html

發(fā)布評論

您暫未設置收款碼

請在主題配置——文章設置里上傳

掃描二維碼手機訪問

文章目錄