iOS的内存管理

通过字面的方式创建出来的对象保存在常量区,通过对象方法和类方法创建出来的对象保存在堆区

内存有系统管理,局部变量保存在栈,当变量离开其所在代码快就会被回收

堆内存

需要程序员自己管理,oc中的对象保存在堆中

内存管理不当会造成的两个问题

内存泄露,不再需要的对象没有释放,导致内存泄露,内存泄露会造成程序闪退

野指针,正在使用的对象被释放了,导致野指针,野指针会导致程序奔溃

MRC 手动内存管理

引用计数

每一个对象都有一个引用计数

当对象出生的时候引用计数器为1

当调用对象的release消息的时候,计数器-1

当一个对象的引用计数为0的时候,这个对象立即被回收

内存管理原则

当给一个对象发送alloc new copy retain消息的时候,就必须在适当的时候发送release或者autorelease消息

当你需要一个对象的时候就给这个对象的引用器+1,当你不需要这个对象的时候,就需要将对象计数器-1

多个对象管理

setter方法

当设置新对象的时候需要做一次retain操作

当原来的对象不需要了,需要对原来的对象做一次release操作

如果是同一个对象,就不需要retain和release操作

当对象消失前,会释放成员所占有的内存

在释放内存之前首先要调用【super dealloc】

当两个或多个对象引用构成一个封闭的环就是循环引用

循环引用导致环中的对象释放不了

解决循环引用,有一端必须是assign的

@property的使用

基本数据类型使用assign

普通对象使用retain

NSString及block使用copy

权限控制readonly只能生成getter方法,readwrite可读可写生成getter和setter方法

线程安全atomic,会给setter方法加锁,访问速度比较慢

noatomic非线程安全,不会给setter方法加锁,访问速度比较快

使用自动释放池延迟对象的释放,原理 自动释放池栈

当你调用autorelease时,该对象会自动加入到自动释放池中

当执行到自动池后面的大括号时候,自动释放池会出栈,此时栈中的对象做一次release操作

你使用几次autorealse,当自动释放池被销毁的时候就会调用几次release

优点,你不必时刻关注对象,让对象的管理简单

缺点对象不能及时释放,如果占有内存很大,会导致你的程序闪退

当一个对象很小,使用次数很少的时候,可以使用自动释放,快速构造方法,其他需要延迟生命周期的地方

自动引用计数,他是编译器特性,不是运行时特性,编译器会在适当的时候插入内存管理的代码

强指针,默认所有的指针都是强指针,只要强指针指向这个对象,这个对象就不会销毁,只要没有strong指向这个对象的时候,这个对象的引用计数为0的时候,这个对象就会被释放

弱指针 不影响对象的销毁,关键词__weak

循环引用 当多个对象间的引用形成一个环的时候就是循环引用,环中所有对象都释放不了

只有当出现循环引用的时候一端必须是weak

assign不参与内存管理,用于基本数据类型

自动释放池

通过类方法创建出来的对象都在离他最近的池中

只有自动释放池销毁的时候,才会释放池中的对象

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值