美文网首页
OC底层实现_准备知识_03

OC底层实现_准备知识_03

作者: 想象不到2019 | 来源:发表于2019-05-21 13:06 被阅读0次

    (一)使用sizeof获取基础变量需要内存空间大小

    #import <Foundation/Foundation.h>
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            
            //基础类型变量,需要内存空间
            NSLog(@"BOOL       需要内存空间字节数:%lu", sizeof(BOOL));
            NSLog(@"int        需要内存空间字节数:%lu", sizeof(int));
            NSLog(@"float      需要内存空间字节数:%lu", sizeof(float));
            NSLog(@"double     需要内存空间字节数:%lu", sizeof(double));
            NSLog(@"NSInteger  需要内存空间字节数:%lu", sizeof(NSInteger));
            NSLog(@"NSUInteger 需要内存空间字节数:%lu", sizeof(NSUInteger));
    
        }
        return 0;
    }
    

    打印结果如下:

    BOOL       需要内存空间字节数:1
    int        需要内存空间字节数:4
    float      需要内存空间字节数:4
    double     需要内存空间字节数:8
    NSInteger  需要内存空间字节数:8
    NSUInteger 需要内存空间字节数:8
    
    Note:sizeof是编译时一元运算符,是在编译期间就计算出内存空间大小.sizeof不是函数,函数是在程序运行时执行的.

    (二)查看指针变量类型需要内存空间大小

            //打印指针变量类型,需要内存空间
            NSLog(@"BOOL *       需要内存空间字节数:%lu", sizeof(BOOL *));
            NSLog(@"int *        需要内存空间字节数:%lu", sizeof(int *));
            NSLog(@"float *      需要内存空间字节数:%lu", sizeof(float *));
            NSLog(@"double *     需要内存空间字节数:%lu", sizeof(double *));
            NSLog(@"NSInteger *  需要内存空间字节数:%lu", sizeof(NSInteger *));
            NSLog(@"NSUInteger * 需要内存空间字节数:%lu", sizeof(NSUInteger *));
    

    打印结果如下:

    BOOL *       需要内存空间字节数:8
    int *        需要内存空间字节数:8
    float *      需要内存空间字节数:8
    double *     需要内存空间字节数:8
    NSInteger *  需要内存空间字节数:8
    NSUInteger * 需要内存空间字节数:8
    

    (三)创建指针变量,使用sizeof继续验证

            // 创建基础变量
            BOOL       isFlag_BOOL = false;
            int        i1_int = 9;
            float      f1_float = 1.22;
            double     d1_double = 3.33;
            NSInteger  nsi1_NSInteger = 199;
            NSUInteger nsui1_NSUInteger = 3456;
            
            // 创建指针变量
            BOOL       *p_BOOL = &isFlag_BOOL;
            int        *p_int = &i1_int;
            float      *p_float = &f1_float;
            double     *p_double = &d1_double;
            NSInteger  *p_NSInteger = &nsi1_NSInteger;
            NSUInteger *p_NSUInteger = &nsui1_NSUInteger;
            
            NSLog(@"      BOOL变量: %lu %lu %lu", sizeof(isFlag_BOOL), sizeof(&isFlag_BOOL), sizeof(p_BOOL));
            NSLog(@"       int变量: %lu %lu %lu", sizeof(i1_int), sizeof(&i1_int), sizeof(p_int));
            NSLog(@"     float变量: %lu %lu %lu", sizeof(f1_float), sizeof(&f1_float), sizeof(p_float));
            NSLog(@"    double变量: %lu %lu %lu", sizeof(d1_double), sizeof(&d1_double), sizeof(p_double));
            NSLog(@" NSInteger变量: %lu %lu %lu", sizeof(nsi1_NSInteger), sizeof(&nsi1_NSInteger), sizeof(p_NSInteger));
            NSLog(@"NSUInteger变量: %lu %lu %lu", sizeof(nsui1_NSUInteger), sizeof(&nsui1_NSUInteger), sizeof(p_NSUInteger));
    

    打印结果如下:

          BOOL变量: 1 8 8
           int变量: 4 8 8
         float变量: 4 8 8
        double变量: 8 8 8
     NSInteger变量: 8 8 8
    NSUInteger变量: 8 8 8
    

    变量 i1_int 是int类型,需要4个字节内存空间.
    指针变量 p_int 指向int变量 i1_int, 存放的是int变量的地址,所以需要8个字节.

    (四)地址验证

            // 打印地址
            NSLog(@"      BOOL变量地址:%p 指针变量指向数据地址:%p 指针变量的地址:%p", &isFlag_BOOL, p_BOOL, &p_BOOL);
            NSLog(@"       int变量地址:%p 指针变量指向数据地址:%p 指针变量的地址:%p", &i1_int, p_int, &p_int);
            NSLog(@"     float变量地址:%p 指针变量指向数据地址:%p 指针变量的地址:%p", &f1_float, p_float, &p_float);
            NSLog(@"    double变量地址:%p 指针变量指向数据地址:%p 指针变量的地址:%p", &d1_double, p_double, &p_double);
            NSLog(@" NSInteger变量地址:%p 指针变量指向数据地址:%p 指针变量的地址:%p", &nsi1_NSInteger, p_NSInteger, &p_NSInteger);
            NSLog(@"NSUInteger变量地址:%p 指针变量指向数据地址:%p 指针变量的地址:%p", &nsui1_NSUInteger, p_NSUInteger, &p_NSUInteger);
    

    打印结果如下:

          BOOL变量地址:0x7ffeefbff50f 指针变量指向数据地址:0x7ffeefbff50f 指针变量的地址:0x7ffeefbff4e0
           int变量地址:0x7ffeefbff508 指针变量指向数据地址:0x7ffeefbff508 指针变量的地址:0x7ffeefbff4d8
         float变量地址:0x7ffeefbff504 指针变量指向数据地址:0x7ffeefbff504 指针变量的地址:0x7ffeefbff4d0
        double变量地址:0x7ffeefbff4f8 指针变量指向数据地址:0x7ffeefbff4f8 指针变量的地址:0x7ffeefbff4c8
     NSInteger变量地址:0x7ffeefbff4f0 指针变量指向数据地址:0x7ffeefbff4f0 指针变量的地址:0x7ffeefbff4c0
    NSUInteger变量地址:0x7ffeefbff4e8 指针变量指向数据地址:0x7ffeefbff4e8 指针变量的地址:0x7ffeefbff4b8
    

    还是继续用整形变量 i1_int,加上xcode工具View memory验证.
    (1)首先通过指针p_int变量的地址0x7ffeefbff4d8查看指针变量存储的值是否是地址0x7ffeefbff508

    通过指针变量的地址找到其存储的数据内容.png
    (2)通过整形变量p_int的地址找到其存储数据的值是9.
    通过变量的地址走到存储数据的值.png
    PS:这每一步都写的尽可能详细了,小伙伴们务必不要轻视这些内容,最好能深刻理解,接下来是算结构体变量需要的内存空间,再加指针变量,理解不透彻,会发现突然就不明白了.

    GitHub项目代码

    相关文章

      网友评论

          本文标题:OC底层实现_准备知识_03

          本文链接:https://www.haomeiwen.com/subject/zvsdzqtx.html