在Debug iOS应用的时候发现一个有趣的现象,有些对象的内存地址位数非常低,有些对象的内存地址位数非常高。
比如:
NSString *str = [[NSString alloc] init]; // 0x00d892b4 NSArray *arr = [[NSArry alloc] init]; // 0x0742fb30
据我了解,操作系统进行内存分配是有一定顺序的,不可能跳跃的分配,那么为什么iOS程序分配内存的时候,地址跳跃极大呢?
在Debug iOS应用的时候发现一个有趣的现象,有些对象的内存地址位数非常低,有些对象的内存地址位数非常高。
比如:
NSString *str = [[NSString alloc] init]; // 0x00d892b4 NSArray *arr = [[NSArry alloc] init]; // 0x0742fb30
据我了解,操作系统进行内存分配是有一定顺序的,不可能跳跃的分配,那么为什么iOS程序分配内存的时候,地址跳跃极大呢?
4 回答4.7k 阅读
5 回答5.6k 阅读✓ 已解决
1 回答1.6k 阅读✓ 已解决
1 回答3.5k 阅读
2 回答1.6k 阅读
1 回答1.5k 阅读
1 回答1.1k 阅读
iOS的内存分三段,Text段存运行时代码,Stack段存编译时申请空间的数据,Heap段存运行时申请空间的数据。
NSString的init方法就是把@""付给这个指针,同:initWithString:@"",同 = @""。iOS会给@""(或@"abcd")在编译时就分配内存,放在Stack段。Stack段是从低位开始向高位使用,不受引用计数控制。
NSArray的init方法则是在运行时才分配空间的,放在Heap段。Heap段是从高位开始的,受引用计数控制。