内存管理
- 内存消耗
- 内存管理模型
- 语言架构
- 减少内存使用的实践
1 内存消耗
- 栈大小
每一个线程都有专有的栈空间,栈内存在线程存在期间自由使用。
每一个函数都有其自己的栈帧,所有的变量都会载入到方法的栈帧中,并且消耗一定的内存。
(函数的递归调用自己说白了就是栈内存的溢出)
- 堆大小
每个进程的所有线程共享一个堆,一个设备的可以使用的堆大小远远小于内存的RAM,最多不超过2分之一。
通过类创建的对象都存放在堆当中
创建一个Person 类
@interface Person : NSObject
/** */
@property (nonatomic,strong)NSString *name;
/** */
@property (nonatomic,assign)NSInteger age;
@end
在另外一个类上面
// 这里面创建的Person 就是
- (Person *)createPersonWithName:(NSString *)name age:(NSInteger)age
{
// 通过类创建的s所有的数据都存放在堆中
Person *p = [Person new];
p.age = age;
p.name = name;
return p;
}
// 函数中将堆内存中copy到栈中
- (void)totalAge{
NSMutableArray * pArr = [NSMutableArray array];
// 0 for 循环 创建 10个人
for (int i = 0; i < 10; i ++) {
NSString *name = [NSString stringWithFormat:@"人物--%d",i];
[pArr addObject:[self createPersonWithName:name age:(NSInteger)i]];
}
// 1 计算着10个人的年纪之和
// totalAge 是开辟栈内存的
NSInteger totalAge = 0;
for (Person *p in pArr) {
// MARK 在使用跑p的 age的时候,必须要先复制到栈上面,才能进行加到totalAge 上
totalAge += p.age;
}
}