iOS中OC對(duì)象可以分為如下的三種:
1、instance對(duì)象(實(shí)例對(duì)象):
(1)這種類型的對(duì)象是通過(guò)類alloc出來(lái)的對(duì)象,每次調(diào)用alloc方法,都會(huì)產(chǎn)生一個(gè)新的instance對(duì)象,然后系統(tǒng)就會(huì)給這個(gè)新對(duì)象分配一塊內(nèi)存空間來(lái)存儲(chǔ)它首懈;
(2)instance對(duì)象可以有多個(gè),每alloc出來(lái)一個(gè)對(duì)象就是一個(gè)新的instance對(duì)象谨敛;
(3)instance對(duì)象在內(nèi)存中存儲(chǔ)的信息包括:
- isa指針:因?yàn)樗械膇nstance對(duì)象所在的類都繼承自NSObject究履,NSObject的底層結(jié)構(gòu)中就有isa指針,所以所有的instance對(duì)象里面都存儲(chǔ)著isa指針脸狸;
- instance對(duì)象所在類的成員變量的具體值最仑,但是不存儲(chǔ)這些成員變量的類型和名稱,也不存儲(chǔ)實(shí)例方法和類方法炊甲。
2泥彤、class對(duì)象(類對(duì)象):
(1)每個(gè)類只有一個(gè)class對(duì)象;
(2)class對(duì)象在內(nèi)存中存儲(chǔ)的信息包括:
- isa指針卿啡;
- superclass指針吟吝;
- 類的屬性信息(@property);
- 類的協(xié)議信息(protocol)颈娜;
- 類的對(duì)象方法信息(instance method):即類的實(shí)例方法(以減號(hào)開頭的方法)剑逃,但是類方法(以加號(hào)開頭的方法)不存儲(chǔ)在class對(duì)象中,而是存儲(chǔ)在meta-class對(duì)象中官辽;
- 類的成員變量信息(ivar):只存儲(chǔ)類的成員變量的類型和名稱(這些只需要存儲(chǔ)一份而已)蛹磺,不存儲(chǔ)這些成員變量的值,值存儲(chǔ)在instance對(duì)象中同仆。
3萤捆、meta-class對(duì)象(元類對(duì)象):
(1)每個(gè)類在內(nèi)存中有且只有一個(gè)meta-class對(duì)象;
(2)meta-class對(duì)象在內(nèi)存中存儲(chǔ)的信息包括:
- isa指針;
- superclass指針鳖轰;
- 類的類方法信息(class method):即以加號(hào)開頭的方法,但不存儲(chǔ)實(shí)例方法(以減號(hào)開頭的方法)。實(shí)例方法存儲(chǔ)在class對(duì)象中。
(3)meta-class對(duì)象是一種特殊的class對(duì)象产捞。
OC對(duì)象的三種類型
相關(guān)代碼:
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
//自定義Person類
@interface Person : NSObject
{
int _age;
int _height;
int _no;
}
@end
@implementation Person
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
/**
獲取instance對(duì)象:
下面獲取到的兩個(gè)instance對(duì)象是不同的兩個(gè)對(duì)象仪壮。
*/
NSObject *object = [[NSObject alloc] init];
NSObject *object1 = [[NSObject alloc] init];
NSLog(@"instance對(duì)象:%p, %p", object, object1);
/**
獲取class對(duì)象:
通過(guò)下面幾種方式獲取到的class對(duì)象是同一個(gè)對(duì)象,每個(gè)類在內(nèi)存中有且只有一個(gè)類對(duì)象甩苛。
*/
Class objectClass = [object class];
Class objectClass1 = [object1 class];
Class objectClass2 = [NSObject class];
Class objectClass3 = object_getClass(object);
Class objectClass4 = object_getClass(object1);
NSLog(@"class對(duì)象:%p, %p, %p, %p, %p", objectClass, objectClass1, objectClass2, objectClass3, objectClass4);
/**
獲取meta-class對(duì)象:
1、在object_getClass函數(shù)中傳入的是class對(duì)象,則獲取到的是meta-class對(duì)象狞膘,每個(gè)類在內(nèi)存中有且只有一個(gè)meta-class對(duì)象;
2什乙、在object_getClass函數(shù)中傳入的是instance對(duì)象挽封,則獲取到的是class對(duì)象;
3臣镣、在object_getClass函數(shù)中傳入的是meta-class對(duì)象辅愿,則獲取到的是NSObject(基類)的meta-class對(duì)象。
*/
Class objectMetaClass = object_getClass([NSObject class]);
NSLog(@"meta-class對(duì)象:%p", objectMetaClass);
//用class_isMetaClass函數(shù)來(lái)判斷傳進(jìn)來(lái)的參數(shù)是不是meta-class對(duì)象忆某。
BOOL isMetaClass = class_isMetaClass(objectMetaClass);
NSLog(@"%d", isMetaClass);
}
return 0;
}
”三人行点待,必有我?guī)熝伞埃?歡迎各位批評(píng)指正。
如果您還覺(jué)得我寫的不錯(cuò)的話請(qǐng)您點(diǎn)贊加關(guān)注弃舒,您的肯定是我前進(jìn)的最大動(dòng)力癞埠!
我是愛(ài)學(xué)習(xí)也愛(ài)您的樹懶O(∩_∩)O