Cocoa的内存管理规则

0x01 三条基本管理规则

1、使用new、alloc和copy方法创建一个对象时,该对象的引用计数器值被置为1。当不再使用该对象时,应该向该对象发送一条release或autorelease消息,使该对象在寿命结束时被销毁;

2、通过其他方法获得一个对象时,假设该对象的引用计数器值为1,而且已经被设置为自动释放,那么就不需要执行任何操作来确保该对象得到清理。如果打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它;

3、如果保留了某个对象,就需要最终释放或自动释放该对象。必须保证retain方法和release方法的使用次数相等。

 

0x02 临时对象

如果我们正在代码中使用某个对象,但并不打算长期拥有该对象,则该对象被视为临时对象。

1、如果该对象是通过new、alloc或copy方法创建的,就需要安排该对象的内存释放,通常使用release消息来实现:

NSMutableArray *array;
array = [[NSMutableArray alloc] init];      // count: 1
// use the array
[array release];                            // count: 0

2、如果使用的是其他方法来获得该对象,则不需要去管对象的销毁工作:

NSMutableArray *array;
array = [NSMutableArray arrayWithCapacity: 17];
// count: 1, autoreleased
// use the array

arrayWithCapacity不同于alloc、new和copy方法,因此可以假设该对象被返回时的引用计数器值为1,并且已经被设置为自动释放。

 

0x03 拥有对象

比较常见的是,我们希望在多段代码中一直拥有某个对象。

典型的方法是把它们加入到集合中(NSArray或NSDictionary),作为其他对象的示例变量来使用,或者作为全局变量来使用。

1、如果是通过new、alloc或copy方法获得了一个对象,则不需要执行任何其他操作。该对象的引用计数器值为1,因此它会一直存在着,只需要确保在拥有该对象的dealloc方法中释放它即可:

- (void) doStuff
{
 // flonkArray is an instance variable
 flonkArray = [NSMutableArray new];        // count: 1
} // doStuff

- (void) dealloc
{
 [flonkArray release];                     // count: 0
 [super dealloc];
} // dealloc

2、如果是通过其他方法获得一个对象并想要长期使用它,需要记得保留该对象,因为它本身已经被设置为自动释放:

- (void) doStuff
{
 // flonkArray is an instance variable
 flonkArray = [NSMutableArray arrayWithCapacity: 17];   // count: 1, autoreleased
 [flonkArray retain];                                   // count: 2, 1 autorelease
} // doStuff

- (void) dealloc
{
 [flonkArray release];                                  // count: 0
 [super dealloc];
} // dealloc

 

0x04 垃圾回收

Objective-C 2.0引入了自动内存管理机制,称为垃圾回收(Garbage collection,简称GC)。

对于已创建和使用的对象,当程序员忘记清理时,系统会自动识别那些对象仍在使用,那些对象可以被回收。

macOS开发中是支持GC的,但是iOS中,只支持MRC和ARC。

GC已经基本被弃用,所以在此不详述。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值