1.引用计数和对象所有权的基本概念
1):每一个对象都拥有一个引用计数(retain count)。
2):当对象被创建的时候,引用计数的值是1。
3):当发送retain消息时,该对象的引用计数加1,该对象的引用计数为2。
4):当向这个对象发送release消息时,该对象的引用计数减一。
5):当一个对象的引用计数为0时,系统自动调用dealloc方法,销毁该对象。
对象所有权的基本概念
当一个所有者(owner,其本身可以是任何一个Objective-C对象)做了以下某个动作时,它就拥有了对一个对象的所有权(ownership)。
a):如果创建或者复制某个对象时,则拥有了该对象的所有权。
alloc,allocWithZone:,copy,copyWithZone:,mutableCopy,mutableCopyWithZone:
b):如果没有创建对象,而是将对象保留使用,同样拥有该对象的所有权。retain
c):如果你拥有了某个对象的所有权,在不需要某一个对象时,需要释放它们。release,autorelease
我们该如何持有对象
a):初始化方法
直接向对象发送retain消息。持有对象的所有权。并在dealloc方法释放该对象。
b):设置方法
1):直接赋值,不保留对象; //常见于代理设计模式,防止循环引用。
2):直接保留对象,在dealloc方法中释放对象;
- (void)setCPU:(CPU *)cpu
{
_cpu = [cpu retain];
}
3):释放旧对象,保留新对象,在dealloc方法中释放对象。//常用于设置器中。
-(void)setCPU:(CPU*)cpu {
if (_cpu ! = cpu) {
[_cpu release];
_cpu = [cpu retain];
}
}
点语法的内存管理
a):赋值
assign:直接赋值,默认。
retain:保留对象。
@synthesize battery = _battery;
b):读写性
readwrite:生成getter、setter方法、默认。
readonly:生产getter方法。
c):原子性
atomic:多线程环境下,存在线程保护,默认。
nonatomic:多线程环境下,不存在线程保护。
*第一种情况*
#赋值
@property(nonatomic,assign) Battery *battery;
@synthesize battery = _battery;
#setter方法
- (void)setBattery:(Battery*)battery
{
_battery = battery;
}//设置方法
#getter方法
- (Battery *)battery
{
@synchronized(self) {
return _battery;
}
}//访问方法
*第二种情况*
#赋值
@property(nonatomic,retain) Battery *battery;
@synthesize battery = _battery;
#setter方法
- (void)setBattery:(Battery*)battery
{
if (_battery != battery) {
[_battery release];
_battery = [battery retain];
}
}//设置方法
#getter方法
- (Battery *)battery
{
@synchronized(self) {
return _battery;
}
}//访问方法
assign,retain与copy的区别
assign
直接赋值,只是一个别名而已。
retain
保留这个对象,两个对象指向了同一个位置。
copy
开辟了一个新的内存空间,分别指向了不同的内存位置,引用计数分别为1,与之前的对象完全脱离关系。在这里我们尤其需要注意,某些时候,copy的作用相当于retain,我们将在复制对象再一次讨论这个问题。
3.自动释放池的基本概念和用法
a):自动释放池的基本概念
cocoa中有一个自动释放池(Autorelease pool)的概念,顾名思义,它是可以存放一些实体的集合,在这个自动释放池中的对象,是能够被自动释放的。NSObject类提供了一个autorelease消息,当我们向一个对象发送autorelease消息时,这个对象就被放入了自动释放池。
b):创建自动释放池
@autoreleasepool {
//入池对象 5.0之前的写法
}
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
//入池对象 5.0之后的写法
[pool release];
自动释放池的销毁时间
当我们向一个对象发送了autorelease消息时,当自动释放池销毁时,会向池中的每一个对象发送一条release消息,以此释放它们。
自动释放池小结
a):自动释放池的数据结构自动释放池以栈的形式实现,当你创建一个新的自动释放池时,它将会被添加到栈顶。接收autorelease消息的对象将被放入栈顶。
b):再谈我们该如何持有对象
当我们使用alloc、copy、retain获得一个对象时,我们需要负责显式地安排对象的死亡,其他方法获得对象将交由自动释放池释放(单例除外)。
c):release与drain的区别
当我们向自动释放池pool发送release消息,它会向池中临时对象发送一条release消息,并且自身也被销毁。当它发送drain消息时,只会执行前者。
d):再谈自动释放池被销毁的时间
当我们使用AppKit创建工程时,程序会自动的创建和排空自动释放池的临时对象,通常是在一个事件循环中创建,结束时排空。
ARC技术的基本概念
ARC自动引用技术(automatic reference counting),当你在编译程序时提供自动管理内存的功能,它会为自动加入内存的控制代码,控制对象的生命周期。如此一来,大大简化了内存管理步骤。注意版本的支持是在IOS4(不支持弱引用)、IOS5上。
垃圾回收机制的基本概念
与Java,.net语言相同,objective-c2.0以后,也提供了垃圾回收机制。但在IOS移动终端设备中,并不支持垃圾回收机制(取决于终端设备的特性)。因此,iphone并不能对内存进行自动垃圾回收处理(中间模式autorelease)。我们需要注意垃圾回收机制并不是ARC,ARC也是需要管理内存的,只不过是隐式的管理内存,编译器会在适当的地方自动插入retain,release和autorelease消息。
关于内存管理
除了alloc、new或copy之外的方法创建的对象都被声明了autorelease。谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release。
大道至简
如果创建一个对象使用了alloc、copy[mutable]、retain,那么你就有义务向这个对象发送一条release或者autorelease消息。
cocoa中的内存管理机制——引用计数
【alloc+1】+【retain+1】+【release+1】+【release+1】
Cocoa中提供了一个机制来实现上面提到的这个逻辑模型,它被称为“引用计数”(reference counting)或“保留计数”(retain counting)。引用计数的数值表示对象有几个“人”在使用它。1):每一个对象都拥有一个引用计数(retain count)。
2):当对象被创建的时候,引用计数的值是1。
3):当发送retain消息时,该对象的引用计数加1,该对象的引用计数为2。
4):当向这个对象发送release消息时,该对象的引用计数减一。
5):当一个对象的引用计数为0时,系统自动调用dealloc方法,销毁该对象。
对象所有权的基本概念
当一个所有者(owner,其本身可以是任何一个Objective-C对象)做了以下某个动作时,它就拥有了对一个对象的所有权(ownership)。
a):如果创建或者复制某个对象时,则拥有了该对象的所有权。
alloc,allocWithZone:,copy,copyWithZone:,mutableCopy,mutableCopyWithZone:
b):如果没有创建对象,而是将对象保留使用,同样拥有该对象的所有权。retain
c):如果你拥有了某个对象的所有权,在不需要某一个对象时,需要释放它们。release,autorelease
我们该如何持有对象
a):初始化方法
直接向对象发送retain消息。持有对象的所有权。并在dealloc方法释放该对象。
b):设置方法
1):直接赋值,不保留对象; //常见于代理设计模式,防止循环引用。
2):直接保留对象,在dealloc方法中释放对象;
- (void)setCPU:(CPU *)cpu
{
_cpu = [cpu retain];
}
3):释放旧对象,保留新对象,在dealloc方法中释放对象。//常用于设置器中。
-(void)setCPU:(CPU*)cpu {
if (_cpu ! = cpu) {
[_cpu release];
_cpu = [cpu retain];
}
}
点语法的内存管理
a):赋值
assign:直接赋值,默认。
retain:保留对象。
copy:拷贝对象。
//只用将例子中的retain换为copy即可。
@property(assign) Battery *battery;@synthesize battery = _battery;
b):读写性
readwrite:生成getter、setter方法、默认。
readonly:生产getter方法。
c):原子性
atomic:多线程环境下,存在线程保护,默认。
nonatomic:多线程环境下,不存在线程保护。
*第一种情况*
#赋值
@property(nonatomic,assign) Battery *battery;
@synthesize battery = _battery;
#setter方法
- (void)setBattery:(Battery*)battery
{
_battery = battery;
}//设置方法
#getter方法
- (Battery *)battery
{
@synchronized(self) {
return _battery;
}
}//访问方法
*第二种情况*
#赋值
@property(nonatomic,retain) Battery *battery;
@synthesize battery = _battery;
#setter方法
- (void)setBattery:(Battery*)battery
{
if (_battery != battery) {
[_battery release];
_battery = [battery retain];
}
}//设置方法
#getter方法
- (Battery *)battery
{
@synchronized(self) {
return _battery;
}
}//访问方法
assign,retain与copy的区别
assign
直接赋值,只是一个别名而已。
retain
保留这个对象,两个对象指向了同一个位置。
copy
开辟了一个新的内存空间,分别指向了不同的内存位置,引用计数分别为1,与之前的对象完全脱离关系。在这里我们尤其需要注意,某些时候,copy的作用相当于retain,我们将在复制对象再一次讨论这个问题。
3.自动释放池的基本概念和用法
a):自动释放池的基本概念
cocoa中有一个自动释放池(Autorelease pool)的概念,顾名思义,它是可以存放一些实体的集合,在这个自动释放池中的对象,是能够被自动释放的。NSObject类提供了一个autorelease消息,当我们向一个对象发送autorelease消息时,这个对象就被放入了自动释放池。
b):创建自动释放池
@autoreleasepool {
//入池对象 5.0之前的写法
}
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
//入池对象 5.0之后的写法
[pool release];
自动释放池的销毁时间
当我们向一个对象发送了autorelease消息时,当自动释放池销毁时,会向池中的每一个对象发送一条release消息,以此释放它们。
自动释放池小结
a):自动释放池的数据结构自动释放池以栈的形式实现,当你创建一个新的自动释放池时,它将会被添加到栈顶。接收autorelease消息的对象将被放入栈顶。
b):再谈我们该如何持有对象
当我们使用alloc、copy、retain获得一个对象时,我们需要负责显式地安排对象的死亡,其他方法获得对象将交由自动释放池释放(单例除外)。
c):release与drain的区别
当我们向自动释放池pool发送release消息,它会向池中临时对象发送一条release消息,并且自身也被销毁。当它发送drain消息时,只会执行前者。
d):再谈自动释放池被销毁的时间
当我们使用AppKit创建工程时,程序会自动的创建和排空自动释放池的临时对象,通常是在一个事件循环中创建,结束时排空。
ARC技术的基本概念
ARC自动引用技术(automatic reference counting),当你在编译程序时提供自动管理内存的功能,它会为自动加入内存的控制代码,控制对象的生命周期。如此一来,大大简化了内存管理步骤。注意版本的支持是在IOS4(不支持弱引用)、IOS5上。
垃圾回收机制的基本概念
与Java,.net语言相同,objective-c2.0以后,也提供了垃圾回收机制。但在IOS移动终端设备中,并不支持垃圾回收机制(取决于终端设备的特性)。因此,iphone并不能对内存进行自动垃圾回收处理(中间模式autorelease)。我们需要注意垃圾回收机制并不是ARC,ARC也是需要管理内存的,只不过是隐式的管理内存,编译器会在适当的地方自动插入retain,release和autorelease消息。
关于内存管理
除了alloc、new或copy之外的方法创建的对象都被声明了autorelease。谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release。
大道至简
如果创建一个对象使用了alloc、copy[mutable]、retain,那么你就有义务向这个对象发送一条release或者autorelease消息。