// 實(shí)例對(duì)象
NSObject *object1 = [[NSObject alloc] init];
NSObject *object2 = [[NSObject alloc] init];
// 類(lèi)對(duì)象
Class objcetClass1 = [object1 class];
Class objcetClass2 = [object2 class];
Class objectClass3 = [NSObject class];
Class objectClass4 = object_getClass(object1);
Class objectClass5 = object_getClass(object2);
// 元類(lèi)對(duì)象
Class objectTetaClass1 = object_getClass([NSObject class]);
Class objectTetaClass2 = object_getClass(objcetClass1);
instance對(duì)象 實(shí)例對(duì)象
通過(guò)類(lèi)alloc出來(lái)的對(duì)象,每次alloc都會(huì)產(chǎn)生新的instance對(duì)象,占據(jù)不同的內(nèi)存
實(shí)例對(duì)象內(nèi)存中只存儲(chǔ)成員變量、isa指針
isa指針地址就是instance對(duì)象的地址
class對(duì)象 類(lèi)對(duì)象
一個(gè)類(lèi)的類(lèi)對(duì)象在內(nèi)存中只有一個(gè)
objcetClass1、objcetClass2、objcetClass3、objcetClass4、objcetClass5指向的指針是同一個(gè)
類(lèi)對(duì)象在內(nèi)存中存儲(chǔ)isa指針、superclass指針、屬性信息、對(duì)象方法信息、協(xié)議信息、類(lèi)的成員變量信息
meta-class對(duì)象 元類(lèi)對(duì)象
元類(lèi)對(duì)象也是Class類(lèi)型
isa、superclass、類(lèi)方法
和類(lèi)對(duì)象內(nèi)存結(jié)構(gòu)是一樣的。
class_isMetaClass 判斷是否是元類(lèi)
object_getClass傳類(lèi)對(duì)象
- NSObject對(duì)象占用多少內(nèi)存
NSObject *obj = [[NSObject alloc] init];
16字節(jié)
- Objective-C代碼
Objective-C -> c\c++ -> 匯編語(yǔ)言(依賴硬件) -> 機(jī)器語(yǔ)言
Objective-C面向?qū)ο蠖际腔赾\c++實(shí)現(xiàn)的
Objective-C對(duì)象基于什么數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)?
結(jié)構(gòu)體(容納不同類(lèi)型)
//
// main.m
// OC_Object
//
// Created by houjianan on 2020/6/10.
// Copyright ? 2020 houjianan. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, char * argv[]) {
@autoreleasepool {
NSObject *obj = [[NSObject alloc] init];
}
return 0;
}
- OC如何轉(zhuǎn)成c\c++
clang
clang -rewrite-objc main.m -o main.cpp
cpp:c plus plus
xcrun
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp
-sdk iphoneos:指定是iphoneos
clang -arch arm64:編譯器指定架構(gòu)
-rewrite-objc main.m -o main-arm64.cpp:重寫(xiě)main.m文件輸出為 main-arm64.cpp
- 查看main-arm64.cpp
// NSObject定義
@interfaction NSObject {
Class isa;
}
@end
// 底層實(shí)現(xiàn)
struct NSObect_IMPL {
Class isa; // 指針 類(lèi)型是Class 指針在64位環(huán)境占8字節(jié) 在32位占4字節(jié)
}
isa內(nèi)存地址賦值給obj isa的內(nèi)存地址就是這個(gè)結(jié)構(gòu)體的地址(就是第一個(gè)成員的地址)
- 實(shí)例對(duì)象
獲得NSObject類(lèi)的實(shí)例對(duì)象的成員變量所占用的大小
NSLog(@"%zd", class_getInstanceSize([NSObject class]));
—> 8
NSLog(@"%zd", sizeof([[Person alloc] init]));
—> 8
獲取obj指針?biāo)赶騼?nèi)存的大小
#import <malloc/malloc.h>
NSObject *obj = [[NSObject alloc] init];
NSLog(@"%zd", malloc_size((__bridge const void *)obj));
—> 16
- 源碼
size_t instanceSize(size_t extraBytes) {
size_t size = alignedInstanceSize() + extraBytes;
// CF requires all objects be at least 16 bytes.
if (size < 16) size =16;
return size;
}
Debug -> Debug Workfllow -> View Memory
輸入內(nèi)存地址 查看內(nèi)存
Student對(duì)象 16字節(jié)
前8字節(jié)放isa
后8字節(jié)放_(tái)no和_age
@interface Student: NSObject
{
@public
int _no;
int _age;
}
@end
@implementation Student
@end
int main(int argc, onst char * argv[]) {
@autoreleasepool {
Student *s = [[Student alloc] init];
s->_no = 4;
s->_age = 5;
stuct Student_IMPL *stuImpl = (__bridge struct Student_IMPL *)stu;
NSLog(@"no is %d, age is %d", stuImpl->_no, stuImpl->_age);
}
}
- .cpp中
struct Student_IMPL {
struct NSObject_IMPL NSObject_IVARS;
int _no;
int _age;
}
struct NSObject_IMPL NSObject_IVARS;
父類(lèi)結(jié)構(gòu)
相當(dāng)于 Class isa; // 8字節(jié) alloc了16字節(jié) 使用8字節(jié)
int _no;
int _age;
自己的成員變量
struct NSObect_IMPL {
Class isa;
}
- calloc
void* calloc(size_t num_items, size_t size) {
void *retval;
retval = malloc_zone_calloc(default_zone, num_items, size);
if (retval == NULL) {
errno = ENOMEM;
}
return retval;
}
- tips
1、指針在64位環(huán)境占8字節(jié) 在32位占4字節(jié)
2、impl縮寫(xiě)implementation:實(shí)現(xiàn)
3、armv7 arm32 arm64等等架構(gòu)
4、沒(méi)有指定架構(gòu)導(dǎo)出來(lái)的cpp文件比指定架構(gòu)的大
5、oc對(duì)象在底層就是一個(gè)結(jié)構(gòu)體
6、具體占多少字節(jié) 跟平臺(tái)有關(guān)系
7、結(jié)構(gòu)體的內(nèi)存地址就是第一個(gè)成員的地址
8、(__bridge const void *) oc和c\c++橋接
9、https://opensource.app.com/tarballs 蘋(píng)果源碼地址
10、int _no 4字節(jié) double 8字節(jié)
11、大端、小端。iOS中是小端
12、結(jié)構(gòu)體內(nèi)存對(duì)齊(有利于CPU訪問(wèn))
13、gnu開(kāi)源組織
14、sizeof是運(yùn)算符,編譯期已經(jīng)確定。
15、class方法 返回的是類(lèi)對(duì)象([NSObject class])
16、object_getClass傳類(lèi)對(duì)象