思考:影響對象內存的因素有哪些?屬性、成員變量、方法 ?數組
@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 代碼驗證: