OC内存管理小记

原创 2013年12月04日 12:06:51
MRC手动管理  ARC自动管理内存Automatic Reference(引用) Counting
ManualReference(引用) Counting


oc采用"引用计数"(retain count)方式管理对象所占的内存
1.使用alloc为对象分配内存//使用dealloc释放对象所占用的内存
2.使用allocnew 或者copy构造对象时,对象的retain count为1
3.调用对象的retain方法可以增加1 retain count
4调用对象的release方法可以减少1 retain count
5当对象的retaincount为0时候,.dealloc会自动调用,释放对象内存,否则 分配给对象的内存将一直被占用
6.所有对象可以使用 retaincount属性查看当前计数器值

会影响计数器的操作
:

1.alloc创建一个对象没并将其引用计数设为1.并拥有对象的所有权
2.copy制造副本 并将副本的 引用计数设为1.并拥有副本的所有权
3,retain使对象引用计数加1.并拥有对象的所有权
4.release使对象引用计数减1.并放弃对象的所有权
5.autorelease 向autoreleasepool注册(>>?)
autorelease,该方法是将该对象内存的管理放到autoreleasepool中

属性声明中内存管理原则
@property(retain,nonatomic)
一个类中 如果这个类有属性声明retain或者copy的属性那么我们需要在这个类的dealloc方法里面去释放这个属性
@property(retain,nonatomic)Student*stu


dealloc方法(系统的方法)
dealloc方法在对象引用计数为0实自动调用
主要用于释放自身所占用的资源.永远不要手动调用dealloc 应有系统自动调用
.m实现
-(void)dealloc
{

self.name=nil;//推荐这种.
//[_name release]//有野指针的情况发生
[super dealloc]
}
这是一个系统方法,系统会自动调用,当一个对象的引用计数为1的时候,再调用release方法的时候,就会自动调用该方法,来释放对象)


内存释放原则一:
对象分配内存,并应在使用后,调用release释放内存
凡是出现retain alloc copy的地方 都要有release与之匹配


自动释放
autorelease pool
延迟释放(延迟到出了池才释放.而且池是最近的池(大括号))
一个大括号就是一个池


NSAutoreleasepool
自动释放池
当创建的对象未来某个时候销毁时 可以使用对象的autorelease
对象将所有权管理交给最近的NSAutoreleasePool对象,并由其全权管理
当池对象drain或release时 会逐一对池内对象发送release消息
+号方法一般使用
多用于有返回值的时候.
其他不建议使用

内存管理原则二:
内存无法确定释放时间时 可以使用autorelease像最近的池注册
由池决定释放所有权的时间
使用便利构造器获得的对象 都应是autorelease的
一定不要释放没有所有权的对象
assign.还有等号直接赋值的.

 @autoreleasepool {                //一个对象刚刚被创造出来引用计数为1        Student*stu1=[[Student alloc]initWithName:@"zhangsan" andAge:22];                NSLog(@"stu1的引用计数为%ld",[stu1 retainCount]);        

[stu1 retain];//retain引用计数加一相当于多了一条命       

NSLog(@"stu1的引用计数为%ld",[stu1 retainCount]);     

[stu1 release];//release引用减一相当于杀死一次      

 NSLog(@"stu1的引用计数为%ld",[stu1 retainCount]);                

[stu1 release];//不可能为0.(再写一次的话就是过度释放)       

 NSLog(@"stu1的引用计数为%ld",[stu1 retainCount]);                   }


代码在硬盘中

堆 :alloc出来的对象//需要做内存管理,手动开辟手动回收
{
    堆区(由程序员分配释放(动态分配内存的)):alloc的内容(对象),实例变量(属于对象的一个部分所以跟对象一样放在堆区),动态属性    OC特别[NSString alloc]initWithFormat]是创建格式化字符串在堆区
        (与数据结构中的堆不同。但分配方式类似与链表
}

栈:局部变量.//不需要我们做内存管理.系统分配系统回收
{
栈区(由编译器自动分配释放):指针(对象的地址),局部变量,方法本身,静态属性
}

代码区:类,方法(在被调用的时候才会占内存)
        (存放函数体的二进制代码)


常量区存放常量和字符串      
  OC特别[[NSString alloc]initWithString]是创建字符串存在于常量区




静态区分为初始化区和未被初始化区):存放全局变量和静态变量
        已被初始化的存放在初始化区,未被初始化的存放在未被初始化区


OC中只需要管理堆里面的东西
程序的内存分配,分为:静态区,常量区,栈,堆,代码区

OC代码14_内存管理

  • 2015年06月02日 14:07
  • 428B
  • 下载

OC中的内存管理

  • 2015年10月21日 18:02
  • 22KB
  • 下载

《深入理解Java虚拟机》学习小记一之自动内存管理机制(一)

Java内存区域与内存溢出异常一、概要二、运行时数据区域2.1程序计数器2.2虚拟机栈2.3本地方法栈2.4堆2.5方法区2.6运行时常量池三、对象访问四、OutOfMemoryError异常4.1J...

OC内存管理详解

  • 2014年05月30日 10:22
  • 18KB
  • 下载

oc内存管理.

  • 2013年11月27日 18:11
  • 168KB
  • 下载

《深入理解Java虚拟机》学习小记一之自动内存管理机制(三)

目录[-] 概要 对象优先分配在Eden分配 大对象直接进入老年代 长期存活的对象进入老年代 动态对象年龄判定 概要 在Java技术体系中,自动内存管...
  • cq1982
  • cq1982
  • 2015年06月09日 17:20
  • 420

OC 中的内存管理

  • 2014年05月30日 09:26
  • 261KB
  • 下载

《深入理解Java虚拟机》学习小记一之自动内存管理机制(一)

目录[-] Java内存区域与内存溢出异常 一、概要 二、运行时数据区域 2.1程序计数器 2.2虚拟机栈 2.3本地方法栈 2.4堆 2.5方法区 2.6运行时常量池 三...
  • cq1982
  • cq1982
  • 2015年06月09日 17:17
  • 444

《深入理解Java虚拟机》学习小记一之自动内存管理机制(二)

27人收藏此文章, 我要收藏发表于24天前(2013-05-12 10:03) , 已有191次阅读 ,共1个评论 目录:[ - ] 1.概要2.判断对象是否存活的算法 2....

《深入理解Java虚拟机》学习小记一之自动内存管理机制(二)

目录[-] 1.概要 2.判断对象是否存活的算法 2.1引用计数算法 2.2根搜索算法 3.GC算法 3.1标记-清除(Mark-Sweep)算法 3.2复制(Copying)算...
  • cq1982
  • cq1982
  • 2015年06月09日 17:20
  • 420
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OC内存管理小记
举报原因:
原因补充:

(最多只允许输入30个字)