黑马程序员——Objective-C内存管理机制——黑马 IOS 技术博客
2014-12-22 21:09
555 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
-------
Objective-C内存管理机制
1.Objective-C中所有对象都在堆区建立,由程序员负责释放对象所占用的内存。内存管理机制由3种:
垃圾回收、引用计数、C语言方式。
2.垃圾回收是Mac OS10.5提供的新方案,在系统存在一个垃圾收集器。如果发现某个对象没有被任何对象使用,该对象被自动释放。
3.C语言方式,原始内存管理方式。用户手动调用malloc、calloc函数分配内存,free回收内存。
4.引用计数机制:对象创建后,运行时系统通过对象维护的一个计数器来描述有多少个其他对象在使用自己,当计数器为0时,释放该对象占用的内存空间(该对象调用dealloc方法)。
5,内存管理规则:当使用alloc,new或copy创建一个对象时,对象的引用计数被设置为1.;向对象发送retain消息,对象引用计数加1;向对象发送release消息时,对象引用计数减1;当对象引用计数为0时,运行时系统向对象发送dealloc消息并回收对象所占用的内存。
6.注意:如果类的实例变量时对象指针,则必须重载dealloc方法(例如圆circle类:有一个变量point是Point*类型);dealloc方法不能直接调用,只有对象的引用计数为0的时候,系统会自动向对象发送dealloc消息。
关于属性的assign、retain、copy关键字生成set方法
assign:简单赋值 浅拷贝 常用于内置类型
-(void)setX(int):aX
{
x = aX;
}
retain: 常用于指针类型,节省内存
例如:圆Circle类中有一个圆心center是Point(用户自定义点类型)和int型半径r
-(void)setPoint(Point*):aPoint
{
if(center != aPoint)
{
[centerrelease]; //原圆心对象引用计数-1
[aPoint retain]; //参数对象引用计数+1
center = aPoint; //这里是指针赋值
}
}
或者
-(void)setPoint(Point*):aPoint
{
[aPoint retain]; //参数对象引用计数+1
[center release]; //原圆心对象引用计数-1
center = aPoint; //这里是指针赋值
}
对应init方法中
-(id)init
{
Point* aPoint = [[Point alloc]init];
self.center = aPoint;
[self.center release];
return self;
}
或者
-(id)initWithPoint:(Point*)aPoint
{
self.point = aPoint;
}
copy: 好处就是重新给center分配内存,避免了retain中center与参数aPoint两个指针同时指向同一个内存对象,但浪费内存。
例如还是上面例子
-(void)setPoint(Point*):aPoint
{
if(center != aPoint)
{
[center release];
center = [[Pointalloc]initWithX:aPoint.x andY:aPoint.y];
}
}
-------
Objective-C内存管理机制
1.Objective-C中所有对象都在堆区建立,由程序员负责释放对象所占用的内存。内存管理机制由3种:
垃圾回收、引用计数、C语言方式。
2.垃圾回收是Mac OS10.5提供的新方案,在系统存在一个垃圾收集器。如果发现某个对象没有被任何对象使用,该对象被自动释放。
3.C语言方式,原始内存管理方式。用户手动调用malloc、calloc函数分配内存,free回收内存。
4.引用计数机制:对象创建后,运行时系统通过对象维护的一个计数器来描述有多少个其他对象在使用自己,当计数器为0时,释放该对象占用的内存空间(该对象调用dealloc方法)。
5,内存管理规则:当使用alloc,new或copy创建一个对象时,对象的引用计数被设置为1.;向对象发送retain消息,对象引用计数加1;向对象发送release消息时,对象引用计数减1;当对象引用计数为0时,运行时系统向对象发送dealloc消息并回收对象所占用的内存。
6.注意:如果类的实例变量时对象指针,则必须重载dealloc方法(例如圆circle类:有一个变量point是Point*类型);dealloc方法不能直接调用,只有对象的引用计数为0的时候,系统会自动向对象发送dealloc消息。
关于属性的assign、retain、copy关键字生成set方法
assign:简单赋值 浅拷贝 常用于内置类型
-(void)setX(int):aX
{
x = aX;
}
retain: 常用于指针类型,节省内存
例如:圆Circle类中有一个圆心center是Point(用户自定义点类型)和int型半径r
-(void)setPoint(Point*):aPoint
{
if(center != aPoint)
{
[centerrelease]; //原圆心对象引用计数-1
[aPoint retain]; //参数对象引用计数+1
center = aPoint; //这里是指针赋值
}
}
或者
-(void)setPoint(Point*):aPoint
{
[aPoint retain]; //参数对象引用计数+1
[center release]; //原圆心对象引用计数-1
center = aPoint; //这里是指针赋值
}
对应init方法中
-(id)init
{
Point* aPoint = [[Point alloc]init];
self.center = aPoint;
[self.center release];
return self;
}
或者
-(id)initWithPoint:(Point*)aPoint
{
self.point = aPoint;
}
copy: 好处就是重新给center分配内存,避免了retain中center与参数aPoint两个指针同时指向同一个内存对象,但浪费内存。
例如还是上面例子
-(void)setPoint(Point*):aPoint
{
if(center != aPoint)
{
[center release];
center = [[Pointalloc]initWithX:aPoint.x andY:aPoint.y];
}
}
相关文章推荐
- 黑马程序员——IOS学习三:Objective-C的扩展OOP,类别,内存管理等——黑马 ios 技术博客
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之17-内存管理和自动引用计数——黑马 IOS 技术博客
- 黑马程序员——Objective-C 内存管理详解——黑马 IOS 技术博客
- 黑马程序员——Objective-C的内存管理MRC与ARC——黑马 IOS 技术博客
- 黑马程序员——IOS学习之二:Objective-C基础语法和关键字——黑马 ios 技术博客
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之09-多态、动态类型和动态绑定——黑马 IOS 技术博客
- 黑马程序员——外企Objective-C面试题(英语版)——黑马 ios 技术博客
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之12-预处理程序——黑马 IOS 技术博客
- 黑马程序员——objective-c数组的四种遍历方法总结——黑马 ios 技术博客
- 黑马程序员——黑马IOS面试学习三:Objective-C 中一些关键字和概念的总汇——黑马 ios 技术博客
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之18-复制对象——黑马 IOS 技术博客
- 黑马程序员——Objective-c学习笔记——类(面向对象)——黑马 ios 技术博客
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之16-使用文件——黑马 IOS 技术博客
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之02-Objective-C 编程环境概述——黑马 IOS 技术博客
- 黑马程序员——IOS学习九:ios开发之数据的持久化存储机制——黑马 ios 技术博客
- 黑马程序员——Objective-C语言简介——黑马 ios 技术博客
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之08-继承——黑马 IOS 技术博客
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之06-选择结构——黑马 IOS 技术博客
- 黑马程序员——Objective-C IOS开发模板——黑马 ios 技术博客
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之14-Foundation框架简介——黑马 IOS 技术博客