Objective-C中内存管理和AutoreleasePool详解

autorelease 延长对象生命周期
把对象放到离自己最近的那个自动释放池中
自动释放池原理
系统中存在一个自动释放池栈,当遇到autorelease时,会把这个自动释放池压入栈中
当自动释放池出栈的时候,会对池中的对象进行一次release操作
自动释放池中,只有栈顶的自动释放池是活动的,其他都在休眠
当你调用autorelease的时候,会把对象放到栈顶,只有栈顶的对象才是活跃的

内存管理

strong 对于普通对象
copy 字符串
assign 基本数据类型
weak 循环引用一端必须使用weak
只要通过类方法创建的对象都放在自动释放池中的

栈 内存有系统管理 变量保存在栈中,当变量离开了所在的代码块就会被回收

堆 需要程序员自己管理

堆造成问题 内存泄漏和野指针

不需要的对象没有释放,导致内存泄漏,内存泄漏会导致应用闪退

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

引用技术,当给一个初始化的时候,对象的引用计数器为1
当给对象发送一条release消息的时候,计数-1
当一个对象的引用计数为0的时候,这个对象即被回收
当你需要一个对象的时候,就给这个对象发送消息,这个对象的引用计数+1,当你不需要这个对象了,就将该对象引用计数-1

当设置新对象的时候,需要对新对象做一次retatin操作
当原来的对象不需要了,需要对原来的对象做一次release操作
dealloc方法,当一个对象即将被销毁的时候会调用这个方法,释放对象所有成员占用的内存
在释放之前首先调用父类方法【super dealloc】

循环引用,当两个或多个对象间的引用构成一个闭环就是循环引用
循环引用导致问题,环中的所有对象都释放不了
解决办法 有一端必须是assign或者weak

基本数据类型 assign 普通对象retain NSString及block对象使用copy

循环一端使用assign
readOnly只生成getter方法
readwrite会生成getter和settter方法
atomic线程安全,会给setter方法加锁,访问速度慢
nonatomic 非线程安全的,不会给setter方法加锁,访问速度比较快
定制方法 在属性里面加setter和getter
自动释放池 作用 延迟对象释放 原理自动释放池栈
当你调用autorelease的时候,改对象会被放到离最近的自动释放池中
当执行到自动释放池后面大括号的时候,自动释放池会出栈,会会对池中的对象进行一次释放操作
你调用几次autorelease,自动释放池销毁的时候就会调用几次release
优点 你不必时刻关注对象的释放,让内存管理变的简单
缺点 对象得不到释放,如果对象占用内存很大,会导致程序闪退
当一个对象很小,使用次数比较少的时候可以使用自动释放
当一个对象占用内存比较大的时候就不要使用自动释放
其他需要延长生命周期的地方
自动引用计数是编译器特性,不是运行时特性,编译器会在适当的时候插入内存管理的代码
强指针 默认所有的指针都是强指针,只有强指针指向这个对象,这个对象就不会释放,没有强指针指向这个对象,这个对象就会马上释放
弱指针 弱指针不影响对象的销毁
关键字_weak
在arc下 ,当出现循环引用的时候,一端必须使用__weak
@property 内存管理 assign 不参与内存管理 ,用于基本数据类型
strong 强引用 用于普通对象
copy 用于复制字符串和block
weak 弱引用 防止循环引用
通过类方法创建出来的对象都放在离他最近的自动释放池中
只有自动释放池销毁的时候才能解除自动释放池对该对象的引用
MRC转ARC项目 Edit -> Refactor-> Convert to Objective-C ARC
选中项⺫⽬目跟节点 -> 选中target -> Build Phases->Compile Sources (1 item) ->在需要 设置为不使⽤用ARC⽂文件所在的⾏行与complier Flags的列 的交汇处双击,写上命令 -fno-objc- arc

类别 扩充原有类的功能
代码模块化
团队协作
可以扩充系统⾃自带类的功能

在分类中可以声明和实现新的⽅方法
在分类的⽅方法中可以访问原有类的成员变量
分类只能扩充功能不能扩充属性
 分类中不能有与原来类同名的⽅方法,不同分类
 中也不能有同名的⽅方法


block 优点 消除了函数不能能定义在⽅方法
  内部的缺点,使⽤用起来更加灵活

一个类可以遵守多个协议中间以逗号隔开

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值