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中的Block使用以及ARC和MAR下的内存管理方式

1.什么是Block?     Block是属于C语言框架     Block是一种数据类型(类似int)     Block是一段代码块,只有在被调用的时候被执行(类似函数和方法) ...
  • XieEXiaoZhang
  • XieEXiaoZhang
  • 2016年07月25日 15:19
  • 980

OC的手动内存管理基础(IOS开发)

OC的内存管理分为三种:          1,手动内存管理(MRC).          2,自动内存管理(ARC)          3,垃圾回收      IOS系统并不支持垃圾回收,现在主要使...
  • aa605397965
  • aa605397965
  • 2015年07月13日 23:39
  • 768

OC学习篇之---内存管理介绍和使用

在之前的一片文章我们说了OC中谓词操作:http://blog.csdn.net/jiangwei0910410003/article/details/41923507,从今天开始我们就来看一下OC中...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2014年12月14日 16:16
  • 9007

OC学习笔记五 内存管理(property 参数)

@property不带参数会默认生成标准的setter getter方法,不会帮助管理内存。 加上了参数才会帮忙管理内存。 基本数据类型(int float....)不需要写参数,或者也可以加上(as...
  • wangjiwei2010
  • wangjiwei2010
  • 2015年08月12日 11:25
  • 556

Swift OC 内存管理

???? 1.??????? ???????,???????????,?????????????????alloc?free,?????????????????????,????,????????...
  • JoeTongOwn
  • JoeTongOwn
  • 2016年08月02日 15:01
  • 143

C++/Objective-C内存管理对比学习

C++内存管理内存分为五个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈。存储函数中局部变量,函数结束时会自动释放。 堆。由new分配的内存块,由应用程序控制它的回收(需要手动回收),即一...
  • linyousong
  • linyousong
  • 2016年02月27日 22:38
  • 345

Objective-C 内存管理机制

一、Objective-C内存管理的对象。二、为什么要使用内存管理。三、Objective-C管理内存的方式。四、与内存有关的修饰符。五、MRC与ARC混编...
  • lover0920
  • lover0920
  • 2016年01月05日 08:57
  • 1653

探讨OC的内存管理 以及防止循环引用retain cycle 代理为什么用weak block为什么用copy

首先声明OC的内存管理机制:引用计数。当一个对象的引用计数为0时,这个对象就会被释放。铭记以上两点,我们开始来探讨。 换句话说,如果一个对象,没有强指针指向,就会被释放。举个很形象的例子,假如每一个对...
  • qinqi376990311
  • qinqi376990311
  • 2016年10月26日 15:17
  • 672

《Objective-C 高级编程 iOS与OS X多线程和内存管理》 核心札记三

核心札记三  GCD  阅读地点:北京 肯德基店  2014.4.8 1,Grand Central Dispatch,简称GCD,iOS4开始引入的新多线程编程功能,它是异步执行任...
  • mapboo
  • mapboo
  • 2014年04月11日 02:34
  • 1272

iOS内存管理---block机制详解

初学者对于block机制一时很难理解。我刚开始学习的时候也是跟着敲代码,并不能说立马理解了其中的道理。今天,我想从2个层次、5个点去相对详细的讲解一下OC中的block机制。 第一层:理解bl...
  • u012526801
  • u012526801
  • 2015年10月20日 19:59
  • 1137
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OC内存管理小记
举报原因:
原因补充:

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