虚拟内存和物理内存
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来初始化这片内存。
网友评论