思考:影响对象内存的因素有哪些?属性、成员变量、方法 ?数组
@interface ABPerson : NSObject
@end
复制代码
ABPerson没有添加任何属性、成员变量、方法,输出是8,这是isa占用的8个字节markdown
添加方法后:app
依然是8,因此方法不占用对象内存布局
添加属性:ui
@interface ABPerson : NSObject
@property (nonatomic,strong) NSString *nickName;
@end
复制代码
去掉isa占用的8个字节,当前属性也占用8个字节atom
添加成员变量:spa
@interface ABPerson : NSObject
{
NSString *_nickName;
}
@end
复制代码
成员变量也是占用内存的。3d
因此,影响对象内存的是属性、成员变量,方法不占用对象内存。code
lldb查看ABPerson对象的内存布局orm
@interface ABPerson : NSObject
-(void)doSomething;
@end
复制代码
@interface ABPerson : NSObject
{
char _c3;
}
@property (nonatomic,strong) NSString *nickName;
@property (nonatomic,assign) int age;
@property (nonatomic) char c1;
@property (nonatomic) char c2;
@end
复制代码
#import "ABPerson.h"
@implementation ABPerson
- (instancetype)init
{
self = [super init];
if (self) {
_c3 = 'c';
}
return self;
}
@end
复制代码
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "ABPerson.h"
#import <objc/runtime.h>
int main(int argc, char * argv[]) {
NSString * appDelegateClassName;
@autoreleasepool {
ABPerson *p = [[ABPerson alloc] init];
p.nickName = @"王";
p.age = 18;
p.c1 = 'a';
p.c2 = 'b';
NSLog(@"%zu",class_getInstanceSize(ABPerson.class));//24
appDelegateClassName = NSStringFromClass([AppDelegate class]);
}
return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}
复制代码
a、b、c的ASCII码分别是9七、9八、99,因此年龄、c一、c二、c3共用了这8个字节,这就是结构体内存对齐
内存对齐原则
struct ABStruct1 {
double a; //8 [0...7]
char b; //1 [8]
int c; //4 9,10,11,[12,13,14,15]
short d; //2 [16,17]
}struct1; //24
struct ABStruct2 {
double a; //8 [0...7]
int b; //4 [8,9,10,11]
char c; //1 [12]
short d; //2 13,[14,15]
}struct2; //16
struct ABStruct3 {
double a; //8 [0...7]
int b; //4 [8,9,10,11]
char c; //1 [12]
short d; //2 13,[14,15]
int e; //4 [16,17,18,19]
struct ABStruct1 str; //24 20,21,22,23,[24...47],
}struct3; //48
复制代码
注释代码部分,分别是不一样类型变量所占字节大小,和占用内存空间的索引。 按照内存对齐原则
,分析ABStruct1的结构体内存对齐:
a
是double类型占用8个字节,占用索引0到7,b
是char类型占用1个字节,索引位置必须是当前类型(char类型)的整数倍,接下来的索引8是1的倍数,b占用索引8,c
是int类型占用4个字节,接下来的索引9,10,11都不是4的倍数,索引12是,因此c占用索引12到15d
是short类型占用2个字节,索引16是2的倍数,因此d占用索引1六、17同理ABStruct1是16,ABStruct3是48 代码验证: