objective-c 使用什么机制管理对象内存
1个回答
展开全部
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];
}
}
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];
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询