系统相关
首页 > 系统相关> > IOS底层探索(一)OC对象内存分析

IOS底层探索(一)OC对象内存分析

作者:互联网

IOS底层探索(一)OC对象内存分析

11.1 OC对象占用内存原理

  1. OC对象 最少占用 16 个字节内存.
  2. 当对象中包含属性, 会按属性占用内存开辟空间. 每一行 16 个字节中, 剩余内存如果可以放下剩余其中一个属性 (参考倒数第二张图) , 则会在行末存储 (注意: 并非一定是按照定义顺序来开辟空间, 放不下就开辟这样). 放不下时会重新开辟一行存储.
    最终满足 16 字节对齐标准.

11.1.1 初始OC对象占用内存

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSObject *objc = [[NSObject alloc] init];
    }
    return 0;
}
clang -rewrite-objc main.m -o main.cpp
typedef struct objc_class *Class;
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <malloc/malloc.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSObject *lbobjc = [[NSObject alloc] init];
        
        NSLog(@"lbobjc对象实际需要的内存大小: %zd",class_getInstanceSize([lbobjc class]));
        NSLog(@"lbobjc对象实际分配的内存大小: %zd",malloc_size((__bridge const void *)(lbobjc)));
    }
    return 0;
}

查看内存大小

断点查看内存

11.1.1.1 查看内存具体内容方法

打开内存查看工具

size_t instanceSize(size_t extraBytes) {
     size_t size = alignedInstanceSize() + extraBytes;
      // CF requires all objects be at least 16bytes.
      if (size < 16) size = 16;
      return size; 
}

11.1.1.2 查看属性占用内存情况

@interface KylPerson : NSObject
@property (nonatomic,assign) int age;
@property (nonatomic,assign) int height;
@property (nonatomic,assign) int row;
@end
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <malloc/malloc.h>
#import "KylPerson.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        //NSObject *kylobjc = [[NSObject alloc] init];
        KylPerson *kp = [[KylPerson alloc] init];
        kp.age = 26;
        kp.height = 180;
        kp.row = 10;
        
        NSLog(@"kylobjc对象实际需要的内存大小: %zd",class_getInstanceSize([kp class]));
        NSLog(@"kylobjc对象实际分配的内存大小: %zd",malloc_size((__bridge const void *)(kp)));
    }
    return 0;
}

由于原本结构体 isa 指针占用8个, 然后 age 属性占用4个, height 占用 4个,此时 一组16字节刚好被占满 , row 属性再占用4个. 再次字节对齐,不足 16 补 16. 答案是 32 个字节.

@interface KylPerson : NSObject
@property (nonatomic,assign) int age;
@property (nonatomic,assign) double height;
@property (nonatomic,assign) int row;
@end

修改height类型为double后的内存

@interface KylPerson : NSObject
@property (nonatomic,assign) int age;
@property (nonatomic,assign) double height;
@property (nonatomic,assign) double row;
@end

标签:字节,16,int,IOS,OC,内存,NSObject,main
来源: https://blog.csdn.net/kyl282889543/article/details/100583885