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,则释放掉。
这样当一个对象被多个地方使用和管理时,可以通过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; }
相关文章推荐
- Objective-c自学笔记(4)-内存管理中retain和release
- Objective-c 内存管理-MRC retain&release
- Objective-C的@property 详解(ios,iphone,xcode,retain,release,assign,copy)
- iPhone/Mac Objective-C内存管理教程和原理剖析(四)系统自动创建新的autorelease pool
- iPhone/Mac Objective-C内存管理教程和原理剖析 【三、@property (retain)和@synthesize的默认实现】
- iPhone/Mac Objective-C内存管理教程和原理剖析(三)@property (retain)和@synthesize的默认实现
- iPhone/Mac Objective-C内存管理教程和原理剖析(三)@property (retain)和@synthesize的默认实现
- Objective-C的@property 详解(ios,iphone,xcode,retain,release,assign,copy)
- iPhone/Mac Objective-C内存管理教程和原理剖析 【四、系统自动创建新的autorelease pool】
- cocos2d-x和objective-c中的retain()和release()
- iPhone/Mac Objective-C内存管理教程和原理剖析 【四、系统自动创建新的autorelease pool】
- IOS 学习之 —— 内存管理alloc,assign,retain,copy,release,autorelease
- iPhone/Mac Objective-C内存管理教程和原理剖析(三)@property (retain)和@synthesize的默认实现
- cocos2d-x内存管理retain和release
- objective-C 的内存管理之-自动释放池(autorelease pool)
- iPhone/Mac Objective-C内存管理教程和原理剖析(三)@property (retain)和@synthesize的默认实现
- iPhone/Mac Objective-C内存管理教程和原理剖析(四)系统自动创建新的autorelease pool
- Objective-C - retain release autorelease assign copy
- Objective-C内存管理之autorelease(二)
- ObjC(Objective-C)的内存管理之-自动释放池(autorelease pool)