OC底层实现_准备知识_03

(一)使用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项目代码

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355

推荐阅读更多精彩内容

  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 1,717评论 0 4
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 2,356评论 0 35
  • 最全的iOS面试题及答案 iOS面试小贴士 ———————————————回答好下面的足够了-----------...
    zweic阅读 2,703评论 0 73
  • 第六期D12课程复盘 三个概念 公司的几个重要资产“应收账款、存货、固定资产、总资产”。 在分析判断公司“经营能力...
    思想者蹲着1982阅读 184评论 0 0
  • 才华,这似乎是一个被谈烂的话题,尤其在这个喧嚣浮躁,人满为患的世界。尤其在这个所谓以人为本的社会。 不过今天...
    听雪传奇阅读 336评论 0 4