OC底层实现_准备知识_03

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

#import 
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)