Objective-C入门16:内存管理
2015-09-22 16:30
423 查看
Objective-C入门16:内存管理
每个对象有一个整数值,这个整数值与对象本身关联,称为引用计数器
当某些地方需要使用这个对象时,可以将引用计数器加1,表示需要使用这个对象
使用完毕之后,将该对象的引用计数器值减1,表示该对象使用完毕
如果引用计数器的值为0时,表明没有地方再使用该对象,这是系统将销毁该对象,其所占内存被收回,以便重用
ARC 自动管理引用计数的(系统默认,当前实际开发 全部是用的是ARC)
MRC 手动管理引用计数的
怎么去操作引用计数
1、什么时候让引用计数加1
alloc、new、copy、retain 引用计数加1
Person *XiaoMing = [ [ Person alloc ] init ] ;
[ XiaoMing retain ] ;
引用计数 是判断这个对象是否被消除的依据
使用 retain为了防止对象被销毁(引用计数为0的时候被销毁
)
NSLog(@"%ld" , XiaoMing.retainCount ) ;
release 使引用计数 -1
[XiaoMing release] ;
NSLog(@"%ld" , XiaoMing.retainCount ) ;
销毁对象的时候会调用 delloc
当引用计数为0的时候就会调用delloc
delloc 不可直接调用是系统自动调用的
[XiaoMing release];
对象的引用计数为0(对象已经被销毁的时候)对象是一个野指针(没有指向任何东西的指针)
试用这个指针再去调用方法或者其他操作
会直接崩溃或者存在潜在危险(数据为空)
如果对象的引用计数为0就不要强制给这个对象 retain
不用咱们管理引用计数的有:
1.分配在栈里面的基本数据类型、
2.不是咱们alloc、new、copy、retain这些操作的
谁分配
谁负责
释放
autorelease 延迟释放
经常和自动释放池配合使用
NSAutoreleasePool 自动释放池的类
也需要对自动释放池实例化对象release
NSAutoreleasePool *pool = [[ NSAutoreleasePool alloc ]init];
当不知道
什么时候对象不再需要使用可以使用 autorelease延迟释放
放到自动释放池里面
Person *gaoShan = [ [ [ Person alloc ] init ] autorelease ] ;
在自动释放池 生命周期结束的时候会触发 autorelease释放延迟释放的对象
[ pool release ] ;
新写法 @autoreleasepool的生命周期
出了花括号
自动释放池
结束
会触发
花括号
里面所有的 autorelease
@autoreleasepool {
Person * ppppp = [ [ [Personalloc ]
init ]autorelease] ;
}
Person *yangXiuWang = [ [ Person alloc ] init ] ;
通过引用计数 来判断是否需要销毁这个对象
alloc、new、copy、retain引用计数+1
引用计数 -1
方法 release、 autorelease
[ yangXiuWang release ] ;
NSAutoreleasePool *pool = [ [ NSAutoreleasePool alloc ] init ] ;
写在自动释放池生命周期以内的
带有延时释放的对象
都会在释放池生命周期结束之后释放
Person *huluwa1 = [ [ [ Person alloc ] init ] autorelease ] ;
Person *huluwa2 = [ [ [ Person alloc ] init ] autorelease ] ;
Person *huluwa3 = [ [ [ Person alloc ] init ] autorelease ] ;
[ pool release ] ;
@autoreleasepool
{
Person *huluwa2 = [ [ [ Person alloc ] init ] autorelease ] ;
}
花括号结束之后就是新写
a450
法自动释放池的生命周期结束的时候
变量的生命周期
局部变量的生命周期:定义的位置
直到定义存在的括号以内
全局变量的生命周期:在对象存在的时候就可以使用
分配在栈里的数据
不用程序员去管理
分配在堆里的需要程序员去管理
每个对象有一个整数值,这个整数值与对象本身关联,称为引用计数器
当某些地方需要使用这个对象时,可以将引用计数器加1,表示需要使用这个对象
使用完毕之后,将该对象的引用计数器值减1,表示该对象使用完毕
如果引用计数器的值为0时,表明没有地方再使用该对象,这是系统将销毁该对象,其所占内存被收回,以便重用
ARC 自动管理引用计数的(系统默认,当前实际开发 全部是用的是ARC)
MRC 手动管理引用计数的
怎么去操作引用计数
1、什么时候让引用计数加1
alloc、new、copy、retain 引用计数加1
Person *XiaoMing = [ [ Person alloc ] init ] ;
[ XiaoMing retain ] ;
引用计数 是判断这个对象是否被消除的依据
使用 retain为了防止对象被销毁(引用计数为0的时候被销毁
)
NSLog(@"%ld" , XiaoMing.retainCount ) ;
release 使引用计数 -1
[XiaoMing release] ;
NSLog(@"%ld" , XiaoMing.retainCount ) ;
销毁对象的时候会调用 delloc
当引用计数为0的时候就会调用delloc
delloc 不可直接调用是系统自动调用的
[XiaoMing release];
对象的引用计数为0(对象已经被销毁的时候)对象是一个野指针(没有指向任何东西的指针)
试用这个指针再去调用方法或者其他操作
会直接崩溃或者存在潜在危险(数据为空)
如果对象的引用计数为0就不要强制给这个对象 retain
不用咱们管理引用计数的有:
1.分配在栈里面的基本数据类型、
2.不是咱们alloc、new、copy、retain这些操作的
谁分配
谁负责
释放
autorelease 延迟释放
经常和自动释放池配合使用
NSAutoreleasePool 自动释放池的类
也需要对自动释放池实例化对象release
NSAutoreleasePool *pool = [[ NSAutoreleasePool alloc ]init];
当不知道
什么时候对象不再需要使用可以使用 autorelease延迟释放
放到自动释放池里面
Person *gaoShan = [ [ [ Person alloc ] init ] autorelease ] ;
在自动释放池 生命周期结束的时候会触发 autorelease释放延迟释放的对象
[ pool release ] ;
新写法 @autoreleasepool的生命周期
出了花括号
自动释放池
结束
会触发
花括号
里面所有的 autorelease
@autoreleasepool {
Person * ppppp = [ [ [Personalloc ]
init ]autorelease] ;
}
Person *yangXiuWang = [ [ Person alloc ] init ] ;
通过引用计数 来判断是否需要销毁这个对象
alloc、new、copy、retain引用计数+1
引用计数 -1
方法 release、 autorelease
[ yangXiuWang release ] ;
NSAutoreleasePool *pool = [ [ NSAutoreleasePool alloc ] init ] ;
写在自动释放池生命周期以内的
带有延时释放的对象
都会在释放池生命周期结束之后释放
Person *huluwa1 = [ [ [ Person alloc ] init ] autorelease ] ;
Person *huluwa2 = [ [ [ Person alloc ] init ] autorelease ] ;
Person *huluwa3 = [ [ [ Person alloc ] init ] autorelease ] ;
[ pool release ] ;
@autoreleasepool
{
Person *huluwa2 = [ [ [ Person alloc ] init ] autorelease ] ;
}
花括号结束之后就是新写
a450
法自动释放池的生命周期结束的时候
变量的生命周期
局部变量的生命周期:定义的位置
直到定义存在的括号以内
全局变量的生命周期:在对象存在的时候就可以使用
分配在栈里的数据
不用程序员去管理
分配在堆里的需要程序员去管理
相关文章推荐
- IE7降低内存和降低CPU的几个技巧
- 如何高效的使用内存
- DOS下内存的配置
- XP/win2003下发现1G的内存比512M还慢的解决方法
- PowerShell实现动态获取当前脚本运行时消耗的内存
- C#实现把dgv里的数据完整的复制到一张内存表的方法
- SQL语句实现查询SQL Server内存使用状况
- C语言内存对齐实例详解
- 深入学习C语言中memset()函数的用法
- 全局变量与局部变量在内存中的区别详细解析
- VB读取线程、句柄及写入内存的API代码实例
- php运行提示:Fatal error Allowed memory size内存不足的解决方法
- IE浏览器IFrame对象内存不释放问题解决方法
- C#之CLR内存深入分析
- JavaScript 变量、作用域及内存
- JavaScript避免内存泄露及内存管理技巧
- J2ME编程中的几个重要概念介绍
- c++实现逐行读取配置文件写入内存的示例
- Shell脚本查看进程内存真实占用情况
- w3wp.exe占用cpu过高的解决方法第1/2页