OC----内存管理
- 每个对象内部都保存了一个与之相关联的整数,称为引用计数器
- 当使用alloc、new或者copy创建一个对象时,对象的引用计数器被设置为1
- 给对象发送一条retain消息,可以使引用计数器值+1
- 给对象发送一条release消息,可以使引用计数器值-1
- 当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收,OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法。
- 可以给对象发送retainCount消息获得当前的引用计数器值
- 谁创建,谁释放(“谁污染,谁治理”)。如果通过alloc、new或(mutable)copy来创建一个对象,那么你必须调用release或autorelease。换句话说,不是你创建的,就不用你去释放。
- 一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease
- 谁retain,谁release。只要你调用了retain,无论这个对象谁如何生成的,你都要调用release
-(void)setBook:(Book*) book{_book=book; }
-(void)setBook:(Book *)book{if(_book!=book){[_book release];_book=[book retain];} }
- 在多线程环境下,原子操作是必要的,否则就有可能引起错误的结果
- 加了atomic,setter/getter是一个原子操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始执行setter的情况,相当于函数头尾加了锁一样
- nonatomic表示禁止多线程,变量保护,提高性能
- atomic是OC使用的一种线程保护技术,防止在写入未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iphone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择
- 如果不需要多线程支持的话,用nonatomic就够了,另外由于不涉及锁操作,所以它执行相对快点
- 自动释放池是OC里面的之中内存自动回收机制,一般可以将一些(临时)变量添加到自动释放池中,统一回收释放
- 当自动释放池销毁时,池里面的所有对象都会调用一次release方法
- OC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中(栈顶的释放池)
- autorelease实际上只是把对release的调用延迟了(相当于延迟回收对象),对于每一次autorelease,系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有对象会被调用renlease
//autoreleasepool代表创建一个自动释放池 @autoreleasepool{
- 在ARC下,不能使用[[NSAutoreleasePool alloc] init],而应当使用@autoreleasepool
- 不要把大量循环操作放到同一个NSAutoreleasePool之间,这样会造成内存峰值的上升
- 尽量避免对大内存使用该方法,对于这种延迟释放机制,还是尽量少用
- sdk中一般利用静态方法创建并返回的对象都是已经autorelease的,不需要再进行release操作,如[NSNumber numberWithInt:10];返回的对象是不需要再release的。但是通过[[NSNumber alloc] initWithInt:10]创建的对象需要release
转载于:https://www.cnblogs.com/hqzxbb/p/4383749.html
OC----内存管理相关推荐
- OC内存管理 -- 黄金法则
(转载) 1.内存管理-黄金法则 The basic rule to apply is everything that increases the reference counter with all ...
- Object-c学习之路二(oc内存管理黄金法则1)
今天看了看oc的内存管理,自己管理内存不能随便的release和retain 法则会出现野指针等错误.下面以人和读书的例子做练习. 1.主函数 // // main.m // MemoryManage ...
- OC内存管理常见面试题整理
1:简述OC中内存管理机制.与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,rea ...
- 黑马程序员--OC内存管理机制(上)
----------------------ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.内存管理机制--引用计数 1.什么是内存管理 ...
- OC 内存管理黄金法则
原文:The basic rule to apply is everything that increases the reference counter with alloc, [mutable]c ...
- 十二:内存简单介绍和OC的内存管理
一.内存简单介绍 内存结构 1.运行时分配 (1)栈:用户存放程序临时创建的局部变量(先进后出). (2)堆:动态分配内存段. 2.编译器分配 (1)BSS段:存放未初始化的全局变量和静态变量. (2 ...
- Objective-C 内存管理机制
为什么要进行内存管理? 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再 ...
- Objective-C学习之旅(四)----内存管理2----retain点语法
一.retain属性的主要作用 1.O-C内存管理和点语法 1>OC内存管理正常情况要使用大量的retain和relrese操作 2>点语法可以减少使用retain和release的操作 ...
- IOS开发系列—Objective-C之内存管理
概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没 ...
- 关于OC的内存管理-01
1.什么是内存管理? 大家都知道手机的内存是有限的,app应用的内存也应该是受限制的,随着app应用的使用会导致内存的占用率增大.当内存占用率达到一种程度时.系统会发出内存警告.这时我们须要把一些不用 ...
最新文章
- php开发我的世界插件,WorldEdit/开发与API
- Fault,Error与Failure的联系与区别
- eeglab教程系列(11)-利用光谱选项绘制ERP图像
- Linux命令学习之nslookup
- oracle-关于时间的sql
- JavaScript+HTML设置视频预览图
- android 蓝牙通信编程
- Lodop,前端自定义打印
- 盈世邮箱服务器pop3,Coremail私有协议为什么比POP3协议、IMAP协议更好
- Gentoo USE参数清单中文详解{转}
- MySQL 数据库之实现热备份
- html控制checkbox选中状态,怎么设置checkbox 选中状态
- SPAN_EXCLUSIVE_INCLUSIVE用法、区别
- 【SVN迁移】SVN迁移服务器代码,包含全部提交日志
- PooledConnection has already been closed.
- 12月原生APP的淘宝客+代理系统完整前后端带完整安装教程
- 【计算机毕业设计】宠物管理系统
- 职业价值观免费免登陆直接在线测试
- 建筑施工技术【11】
- Ae:文本图层操作基础