OC视频笔记-引用计数和对象所有权的基本概念

1.引用计数和对象所有权的基本概念

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消息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值