您的位置:首页 > 移动开发 > Objective-C

Objective-C 内存管理retain和release

2014-11-12 13:30 302 查看
OC使用引用计数来管理内存,每一个继承NSObject的对象,内部都维护了一个引用计数器retainCount,当对象创建时(调用alloc或者new)引用计数器会+1, 手动调用retain()方法可以使引用计数器+1,手动调用release()方法可以使引用计数器-1,当引用计数器为0时,对象会自动调用"析构函数" dealloc()方法来回收资源和释放内存。

这样当一个对象被多个地方使用和管理时,可以通过retain()将引用计数器+1,来获取使用权限(防止其他使用者释放该对象),用完了之后再通过调用release()将引用计数器-1来放弃使用权限(此时如果引用计数器为0,说明没有其他地方再使用该对象了,直接会被释放,如果引用计数器不为0,则证明还有其他地方再使用这个对象,该对象不会被释放)。这是一种设计非常优雅的内存管理机制,谁使用谁retain()用完之后release(),如果已经没有人使用它了,引用计数器为0,则释放掉。

//
//  Goods.h
//  08_Retain&&Release
//
//  Created by apple on 14-11-12.
//  Copyright (c) 2014年 cc. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Goods : NSObject

@property int price;

/**
*  dealloc方法,对象释放时会调用,用于资源的回收,相当于C++中的析构函数
*  dealloc方法需要重写父类的方法,实现释放当前类的资源
*/
- (void)dealloc;

@end


//
//  Goods.m
//  08_Retain&&Release
//
//  Created by apple on 14-11-12.
//  Copyright (c) 2014年 cc. All rights reserved.
//

#import "Goods.h"

@implementation Goods

- (void)dealloc {

//TODO: 释放资源代码

NSLog(@"%@被释放了", self);

//需要调用父类来释放对象
[super dealloc];
}

@end


//
//  main.m
//  08_Retain&&Release
//
//  Created by apple on 14-11-12.
//  Copyright (c) 2014年 cc. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Goods.h"

int main(int argc, const char * argv[]) {

@autoreleasepool {

//当调用alloc或者new创建一个OC对象时,引用计数+1
Goods* pGoods = [[Goods alloc] init];
//输出: 1
NSLog(@"retainCount=%lu", (unsigned long)[pGoods retainCount]);

//调用retain时引用计数+1
[pGoods retain];
//输出: 2
NSLog(@"retainCount=%lu", (unsigned long)[pGoods retainCount]);

//调用release时引用计数-1
[pGoods release];
//输出: 1
NSLog(@"retainCount=%lu", (unsigned long)[pGoods retainCount]);

//调用release时引用计数-1,此时retainCount为0,内存将被释放,自动调用realloc来释放资源和内存
[pGoods release];

}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐