iOS Kit

iOS底层 -- 内存管理之内存布局、Tagged Pointe

2020-09-20  本文已影响0人  happy神悦
一、iOS程序的内存布局

代码例子如下

int a = 10;
int b;

implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self test1];
}

- (void)test1 {
    static int c = 20;

    static int d;

    int e;
    int f = 20;

    NSString *str = @"123";

    NSObject *obj = [[NSObject alloc] init];

    NSLog(@"\n&a=%p\n&b=%p\n&c=%p\n&d=%p\n&e=%p\n&f=%p\nstr=%p\nobj=%p\n",
          &a, &b, &c, &d, &e, &f, str, obj);
}

分析结果如下

/*
 字符串常量
 str=0x1029a4068

 已初始化的全局变量、静态变量
 &a =0x1029a4db8
 &c =0x1029a4dbc

 未初始化的全局变量、静态变量
 &d =0x1029a4e80
 &b =0x1029a4e84

 堆
 obj=0x60400001b510

 栈
 &e =0x7ffeed25a994
 &f =0x7ffeed25a990
 */

二、Tagged Pointer
三、判断是否为Tagged Pointer
// 如果是iOS平台(指针的最高有效位是1,就是Tagged Pointer)
#   define _OBJC_TAG_MASK (1UL<<63)

// 如果是Mac平台(指针的最低有效位是1,就是Tagged Pointer)
#   define _OBJC_TAG_MASK 1UL

- (BOOL)isTaggedPointer:(id)pointer {
    return ((uintptr_t)pointer & _OBJC_TAG_MASK) == _OBJC_TAG_MASK;
}

调用

// 是否是tagger pointer
- (void)test3 {
    NSNumber *number1 = @4;
    NSNumber *number2 = @5;
    NSNumber *number3 = @(0xFFFFFFFFFFFFFFF);

    NSLog(@"%d %d %d", [self isTaggedPointer:number1], [self isTaggedPointer:number2], [self isTaggedPointer:number3]);
    NSLog(@"%p %p %p", number1, number2, number3);
}

执行结果

图解说明

四、OC对象的内存管理
内存管理的经验总结
上一篇 下一篇

猜你喜欢

热点阅读