iOS程序的内存布局

turboksiOS287

image.png

  1.     代码段:编译之后的代码

  2.     数据段:

    1. 字符串常量:比如NSString * str = @“123”

    2. 已初始化数据:已初始化的全局变量、静态变量等

    3. 未初始化的数据:未初始化的全局变量、静态变量等

  3.     栈:函数调用开销,比如局部变量。分配的内存空间地址越来越小

  4.     堆:通过alloc、malloc、calloc等动态分配的空间,分配的空间地址越来越大



    Tagged Pointer:

    1.    从64bit开始,iOS引入了Tagged Pointer技术,用于优化NSNumber、NSDate、NSString等小对象的存储。

    2.    在没有使用Tagged Pointer之前,NSNumber等对象需要动态分配内存、维护引用计数等,NSNumber指针存储的是堆中NSNumber对象的地址值。

    3.    使用Tagged Pointer之后,NSNumber指针里边存储的数据变成了:Tag + Data,也就是将数据直接存储在了指针中

    4.    当指针不够存储数据时,才会使用动态分配内存的方式来存储数据

    5.    objc_msgSend能识别Tagged Pointer,比如NSNumber的intValue方法,直接从指针提取数据,节省了以前的调用开销


    如何判断一个指针是否为Tagged Pointer?

    1.    iOS平台,最高有效位是1(第64bit)

    2.    Mac平台,最低有效位是

    image.png


    

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        

        NSString * name;

        name = [NSString stringWithFormat:@"asd"];

        NSLog(@"%@",name);

        

        

        NSString * str;

        str = [NSString stringWithFormat:@"asdfghjklqwertyuiopasdfghjklqwertyuiop"];

        NSLog(@"%@",str);


    }

    return 0;

}


打印结果:

(lldb) p name

(NSTaggedPointerString *) $3 = 0xd4246379d93db1bf @"asd"

(lldb) p str

(__NSCFString *) $4 = 0x000000010042a200 @"asdfghjklqwertyuiopasdfghjklqwertyuiop"

(lldb) 

    

    


返回列表

上一篇:GCD定时器

下一篇:dealloc

相关文章

iOS音视频之视频播放

iOS音视频之视频播放

由于MPMoviePlayerController与MPMoviePlayerViewController在iOS9.0之后被弃用,所以采用AVPlayer以及AVPlayerViewControll...

Runtime详解

Runtime详解

The Objective-C language defers as many decisions as it can from compile time and link time to runti...

dealloc

dealloc

当调用dealloc方法的时候,执行顺序可以在源码中查找如下(objc源码):1.// Replaced by NSZombies- (void)dealloc {    _obj...

iOS图片圆角设置

iOS图片圆角设置

    UIImageView * vv = [[UIImageView alloc] initWithFrame:CGRectMake(50, 500, 250, 25...

isKindOfClass和isMemberOfClass的区别

isKindOfClass和isMemberOfClass的区别

+ (BOOL)isMemberOfClass:(Class)cls {//    类的元类 与 传入类 对比    return object_getClas...

多线程举例

多线程举例

举例一:- (void)viewDidLoad {    [super viewDidLoad];    dispatch_queue_t queue = di...