美文网首页
alloc 和 init都做了什么

alloc 和 init都做了什么

作者: 写代码的小农民 | 来源:发表于2019-04-25 23:37 被阅读0次

    虚拟内存和物理内存
    clean memory
    在闪存中有备份,能再次读取重建。如:
    Code(代码段),framework,memory-mapped files
    dirty memory 如:
    被分配了的堆空间,image cache

    NSString *str1 = [NSString stringWithString:@"Welcome!"];// 1.
    NSString *str2 = @"Welcome"; // 2.
    char *buf = malloc(100 * 1024 * 1024); // 3.分配100M内存给buf
    for (int i = 0; i < 3 * 1024 * 1024; ++i) {
    buf[i] = rand();
    } // 4.buf的前3M内存被赋值
    

    1、直接分配到堆上 有程序员手动释放
    2、常量字符串 ,分配到只读数据段。如果这块内存被释放了,而我们又访问他的时候,系统可以在只读数据段里把值再读出来重建这块内存,所以这种方法创建的string没有引用计数。
    3、C语言的alloc系统会分配100M虚拟内存给buf,分配的区域是clean memory。直到使用的时候才会映射到物理内存上。
    如果是[Person alloc]这个时候会直接映射到物理内存上。

    对象的大小要看成员变量是什么类型的
    *isa 是8个字节 + string 8个字节 + int 4个字节 但是对象分配内存大小的时候会字节补齐成16个字节 ,所以对象的大小只会是16的倍数

    [Person alloc] 会在堆上分配一块内存,并把内存地址返还给对象的isa指针。
    但是如果要使用这个对象 一定要init 只有init初始化之后这个对象才能够使用。
    就像操作系统就是政府,alloc就是去争地,init就是在地上修房子。没有调用init,房子都没有修好,别人怎么买房进去住?所以我们需要用init来初始化这片内存。

    相关文章

      网友评论

          本文标题:alloc 和 init都做了什么

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