任何继承了NSObject的对象,都需要内存管理,
但是对基本数据类型无效(不需要释放)
原理:
  1. 每个对象内部都保存了一个与之相关联的整数,称为引用计数器
  2. 当使用alloc、new或者copy创建一个对象时,对象的引用计数器被设置为1
  3. 给对象发送一条retain消息,可以使引用计数器值+1
  4. 给对象发送一条release消息,可以使引用计数器值-1
  5. 当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收,OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法。
  6. 可以给对象发送retainCount消息获得当前的引用计数器值
向对象发送某个消息,相当于调用某个方法。
内存管理原则:
  1. 谁创建,谁释放(“谁污染,谁治理”)。如果通过alloc、new或(mutable)copy来创建一个对象,那么你必须调用release或autorelease。换句话说,不是你创建的,就不用你去释放。
  2. 一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease
  3. 谁retain,谁release。只要你调用了retain,无论这个对象谁如何生成的,你都要调用release
如果在某个对象方法中retain了另一个对象,需要在这个对象释放的时候同时释放retain的那个对象。
如果想要retain对象新的成员变量,先释放掉旧的成员变量;在释放掉旧的成员变量前要先判断新传递进来的成员变量与原来的成员变量是否相同,如果不同则释放掉旧的成员变量,如果相同则不release旧的成员变量,也不进行retain。
@property内存管理新特性:
@property一般帮我们自动生成的setter方法是很简单的方法,不能实现内存管理,例如:
-(void)setBook:(Book*) book{_book=book;
}

所以我们一般需要自己去实现book的setter方法,例如:
-(void)setBook:(Book *)book{if(_book!=book){[_book release];_book=[book retain];}
}

假如我们在某个类里要使用很多个@property 语句去使用类的属性的时候,如果还要自己在.m文件中去写setter方法会很麻烦,所以我们可以这么写:
@property (retain)Book* book;
@property (retain)Card* card;
这里的retain代表:release旧的值,retain新的值
这样相当于我们在.m文件中实现了带有内存管理的setter方法(即上面的代码)
@property的其他参数:默认是(readwrite)属性,同时生成get和set方法
@property(assign)int age;这句跟@property int age等价,@property默认就是assign参数的
@property(readonly)int age;这句表示age是一个只读变量,表示只生成get方法
@property
格式:@property(参数1,参数2) 类型 名字;
参数可有可无,比如:
@property int age;
@property (nonatomic,retain)UIButton* btn;
参数主要分为3类:
读写属性:readwrite/readonly
setter处理:assign/retain/copy
原子性:atomic/nonatomic 
@property属性默认为atomic,提供多线程安全
  • 在多线程环境下,原子操作是必要的,否则就有可能引起错误的结果
  • 加了atomic,setter/getter是一个原子操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始执行setter的情况,相当于函数头尾加了锁一样
nonatomic代表方法不考虑线程安全问题:
  • nonatomic表示禁止多线程,变量保护,提高性能
  • atomic是OC使用的一种线程保护技术,防止在写入未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iphone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择
  • 如果不需要多线程支持的话,用nonatomic就够了,另外由于不涉及锁操作,所以它执行相对快点
@property的setter处理:
assign:默认类型,setter方法直接赋值,而不进行retain操作
retain:setter方法release旧值,再retain新值
copy:setter方法release旧值,再copy新值(暂时先这么理解,后续会有关于copy语法的新解释
@property的读写属性:
readwrite:产生setter和getter
readonly:只产生简单的getter,没有setter
@property的其他用法:
例如:@property(nonatomic,getter=isRich)BOOL rich;
//getter是用来指定getter方法的方法名,同理setter也可以这样用
自动释放池(autorelease pool)
  • 自动释放池是OC里面的之中内存自动回收机制,一般可以将一些(临时)变量添加到自动释放池中,统一回收释放
  • 当自动释放池销毁时,池里面的所有对象都会调用一次release方法
  • OC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中(栈顶的释放池)
  • autorelease实际上只是把对release的调用延迟了(相当于延迟回收对象),对于每一次autorelease,系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有对象会被调用renlease
//autoreleasepool代表创建一个自动释放池
@autoreleasepool{ 
//使用自动释放池:
//之前:
Book* book =[[Book alloc] init];
[student setBook:book];
[book release];
//现在:
Book *book =[[[Book alloc] init] autorelease];
[student setBook:book];
//不用调用[book release]
}

静态方法不需要自己释放内存,我们在开发中会经常用到静态方法,因为我们在实现静态方法时,会把变量放到autorelease中这样就不用我们自己去释放内存了
另外:静态方法不能访问对象的成员变量
autorelease pool注意:
  • 在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----内存管理相关推荐

  1. OC内存管理 -- 黄金法则

    (转载) 1.内存管理-黄金法则 The basic rule to apply is everything that increases the reference counter with all ...

  2. Object-c学习之路二(oc内存管理黄金法则1)

    今天看了看oc的内存管理,自己管理内存不能随便的release和retain 法则会出现野指针等错误.下面以人和读书的例子做练习. 1.主函数 // // main.m // MemoryManage ...

  3. OC内存管理常见面试题整理

    1:简述OC中内存管理机制.与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,rea ...

  4. 黑马程序员--OC内存管理机制(上)

    ----------------------ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.内存管理机制--引用计数 1.什么是内存管理 ...

  5. OC 内存管理黄金法则

    原文:The basic rule to apply is everything that increases the reference counter with alloc, [mutable]c ...

  6. 十二:内存简单介绍和OC的内存管理

    一.内存简单介绍 内存结构 1.运行时分配 (1)栈:用户存放程序临时创建的局部变量(先进后出). (2)堆:动态分配内存段. 2.编译器分配 (1)BSS段:存放未初始化的全局变量和静态变量. (2 ...

  7. Objective-C 内存管理机制

    为什么要进行内存管理? 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再 ...

  8. Objective-C学习之旅(四)----内存管理2----retain点语法

    一.retain属性的主要作用 1.O-C内存管理和点语法 1>OC内存管理正常情况要使用大量的retain和relrese操作 2>点语法可以减少使用retain和release的操作 ...

  9. IOS开发系列—Objective-C之内存管理

    概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没 ...

  10. 关于OC的内存管理-01

    1.什么是内存管理? 大家都知道手机的内存是有限的,app应用的内存也应该是受限制的,随着app应用的使用会导致内存的占用率增大.当内存占用率达到一种程度时.系统会发出内存警告.这时我们须要把一些不用 ...

最新文章

  1. php开发我的世界插件,WorldEdit/开发与API
  2. Fault,Error与Failure的联系与区别
  3. eeglab教程系列(11)-利用光谱选项绘制ERP图像
  4. Linux命令学习之nslookup
  5. oracle-关于时间的sql
  6. JavaScript+HTML设置视频预览图
  7. android 蓝牙通信编程
  8. Lodop,前端自定义打印
  9. 盈世邮箱服务器pop3,Coremail私有协议为什么比POP3协议、IMAP协议更好
  10. Gentoo USE参数清单中文详解{转}
  11. MySQL 数据库之实现热备份
  12. html控制checkbox选中状态,怎么设置checkbox 选中状态
  13. SPAN_EXCLUSIVE_INCLUSIVE用法、区别
  14. 【SVN迁移】SVN迁移服务器代码,包含全部提交日志
  15. PooledConnection has already been closed.
  16. 12月原生APP的淘宝客+代理系统完整前后端带完整安装教程
  17. 【计算机毕业设计】宠物管理系统
  18. 职业价值观免费免登陆直接在线测试
  19. 建筑施工技术【11】
  20. Ae:文本图层操作基础

热门文章

  1. 《CSS揭秘》读书笔记
  2. 图灵社区 和 大家网
  3. AD-查找符合指定条件的用户Get-User
  4. Linux 信号量 生产者消费者小例题
  5. 疯狂ios讲义疯狂连载之实现游戏逻辑(2)
  6. IE开发人员工具无法使用
  7. 【心情】今天买了ZÈRTZ!
  8. ondestroy什么时候调用_尾调用和尾递归
  9. 刚接触git,提交文件时,遇到no changes added to commit
  10. BZOJ1578: [Usaco2009 Feb]Stock Market 股票市场