黑马程序员****OC语言基础****MRC的理解
来源:互联网 发布:精子优化处理检查 编辑:程序博客网 时间:2024/06/05 19:13
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
概念:
MRC:MannulReference Counting ( 手动管理 )
对引用计数器的操作 :
retain消息:使计数器+1,该方法返回对象本身
release消息:使计数器-1(并不代表释放对象)
retainCount消息:获得对象当前的引用计数器值
当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。
当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这里释放相关的资源,dealloc就像是对象的“临终遗言”。
一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直接调用dealloc方法)。
Person.h声明:
<span style="font-size:24px;">#import <Foundation/Foundation.h>@interface Person : NSObject @property int age;@end</span>
Person.m实现:
<span style="font-size:24px;">#import "Person.h" @implementation Person//重写dealloc方法 -(void)dealloc{//释放子类对象NSLog(@"对象被销毁了~"); //释放父类[super dealloc];}@end</span>
<span style="font-size:24px;">#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { Person *p = [[Person alloc] init]; NSLog(@"p的retainCount = %ld",p.retainCount); Person *p1 = [[Person alloc] init]; NSLog(@"p1的retainCount = %ld",p1.retainCount); [p1 retain]; NSLog(@"p1的retainCount = %ld",p1.retainCount); [p1 release]; NSLog(@"p1的retainCount = %ld",p1.retainCount); [p1 release]; //此时p还没释放,造成内存泄露了 return 0;}</span>
p1的retainCount = 1
p1的retainCount = 2
p1的retainCount = 1
对象被销毁了~
实例分析:凤姐去拉萨多对象处理
Person.h声明:
<span style="font-size:24px;">#import <Foundation/Foundation.h>#import "Car.h"@interface Person : NSObject{ Car *_car;}-(void)dealloc;-(void)goLasa;-(void)setCar:(Car *)car;@end</span>
Person.m的实现:
<span style="font-size:24px;">#import "Person.h"@implementation Person-(void)dealloc{ [_car release]; //在人对象释放前,先释放掉车的对象 NSLog(@"人已经挂了!"); [super dealloc];}-(void)goLasa{ [_car run]; //插入车的跑方法}/*此处会有一个新的问题: 如果此时并未出现新的对象,而是旧的对象,如果没有判断的话 此时旧的对象会变成僵尸对象,程序则会出错。*/-(void)setCar:(Car *)car{ if(_car != car){ [_car release]; //为了防止车的多对象产生内存泄露,在retain之 // 前释放掉当前对象 _car = [car retain]; //给人的对象设置车时,再次增加一次车的retain } }@end</span>
Car.h声明:
<span style="font-size:24px;">#import <Foundation/Foundation.h>@interface Car : NSObject/*{ int _speed;}*/@property int speed;-(void)dealloc;//-(int)setSpeed:(int)speed;//-(void)getSpeed;-(void)run;@end</span>
Car.m的实现:
<span style="font-size:24px;">#import "Car.h"@implementation Car-(void)dealloc{ NSLog(@"速度为 %d 码的车已经挂了",_speed); [super dealloc];}/*-(int)setSpeed:(int)speed{ _speed = speed; return speed;}-(void)getSpeed{ }*/-(void)run{NSLog(@"汽车正以%d码的速度奔向拉萨",_speed);}@end</span>
main.m主函数:
<span style="font-size:24px;">#import <Foundation/Foundation.h>#import "Car.h"#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person *fj = [Person new];//此时fj的retainCount就变成了1; Car *bmw = [Car new];//此时bmw的retainCount就变成了1; [fj setCar:bmw]; // [bmw setSpeed:100]; bmw.speed = 200; [fj goLasa];//在setCar中插入了[_car retain] [fj goLasa];//此时bmw的retainCount就变成了2; [fj goLasa]; NSLog(@"retainCount = %lu",bmw.retainCount); [bmw release];//内存管理原则,谁创建谁release Car *qq = [Car new]; [fj setCar:qq]; [qq setSpeed:20]; // NSLog(@"retainCount = %lu",bmw.retainCount); [fj goLasa]; [fj goLasa]; [fj goLasa]; [qq release]; [fj release];//内存管理原则,谁创建谁release // NSLog(@"retainCount = %lu",bmw.retainCount); } return 0;}</span>
运行结果:汽车正以200码的速度奔向拉萨
汽车正以200码的速度奔向拉萨
汽车正以200码的速度奔向拉萨
retainCount = 2
速度为 200 码的车已经挂了
汽车正以20码的速度奔向拉萨
汽车正以20码的速度奔向拉萨
汽车正以20码的速度奔向拉萨
速度为 20 码的车已经挂了
人已经挂了!
- 黑马程序员****OC语言基础****MRC的理解
- 黑马程序员---OC基础---内存管理(MRC、ARC)
- 黑马程序员****OC语言基础****Block概念和理解
- 黑马程序员****OC语言基础****protocol概念和理解
- 黑马程序员****OC语言基础****NSString类的概念和理解
- 黑马程序员****OC语言基础****多态的概念和理解
- OC基础-ARC和MRC的理解及应用
- 黑马程序员 OC中的block的基础理解
- 黑马程序员-OC语言基础学习(一)
- 黑马程序员-OC语言基础学习(二)
- 黑马程序员-OC语言基础学习(三)
- 黑马程序员-OC语言基础学习(四)
- 黑马程序员-OC语言基础学习(五)
- 黑马程序员-OC语言基础
- 黑马程序员IOS-OC语言-简介、基础
- 黑马程序员-OC语言基础:内存管理
- 黑马程序员-OC语言基础:协议
- 黑马程序员-OC语言基础:block
- 数据结构学习(一)字符串截取的C语言实现
- 2014找工作总结-机会往往留给有准备的人
- 51nod 1256 乘法逆元 (模板)
- fs4412开发板学习笔记(十三)
- RSA加密解密与签名
- 黑马程序员****OC语言基础****MRC的理解
- 2015 ACM-ICPC沈阳赛区赛后心得
- fs4412开发板学习笔记(十四)
- Crazyflie2.0笔记四: eclipse编译、开发环境搭建
- 缓存操作流程逻辑
- fs4412开发板学习笔记(十五)
- HDU 4676 Sum Of Gcd(莫队+莫比乌斯反演)
- SpringMVC-----1、SpringMVC概述
- Android tv 动画效果faq (放大动画 与ScrollView滚动照成 页面漂移交错)