iOS程序的内存布局

turboksiOS105

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

相关文章

isKindOfClass和isMemberOfClass的区别

isKindOfClass和isMemberOfClass的区别

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

iOS一行代码搞定自定义AlertView

iOS一行代码搞定自定义AlertView

效果图走一走:使用方式: pod  'KSAlertView'举例使用,单按钮Alert: [[[KSAlertView alloc] initWithT...

OC的实例对象、类对象、元类对象的关系

OC的实例对象、类对象、元类对象的关系

Objective-C中的对象、简称OC对象,主要分为三种:instance对象(实例对象)、class对象(类对象)、meta-class对象(元类对象)。一:instance对象instance对...

iOS基于SceneKit的3D汽车改色

iOS基于SceneKit的3D汽车改色

基于SceneKit的汽车改色,需要修改模型文件可以去 https://www.turbosquid.com/ 自行下载,免费资源还挺多的。先上个效果图吧:核心代码: &...

WKWebView

WKWebView

<!DOCTYPE html><head>    <title>HTML</title>    <meta...

iOS的分类(Category)

iOS的分类(Category)

一:Category的底层结构定义在objc-runtime-new.h中:struct category_t {    const char *name;   ...