Objective-C---9---内存管理 补充
2015-10-09 11:05
411 查看
1. 内存管理补充:
1.1. setter方法:
@autoreleasepool { #pragma 验证Person类dealloc方法里的:[_car release] { Person *p = [[Person alloc] init]; Car *c = [[Car alloc] init]; [c setSpeed:100]; [p setCar:c]; [p go]; [c release]; [p go]; [p go]; [p release]; } #pragma 验证Person类setCar方法里的:[_car release] { Person *p = [[Person alloc] init]; Car *bmw = [[Car alloc] init]; [bmw setSpeed:100]; [p setCar:bmw]; [p go]; [bmw release]; Car *byd = [Car new]; [byd setSpeed:80]; [p setCar:byd]; [p go]; [byd release]; [p release]; } #pragma 验证Person类setCar方法里的:if (_car != car) { Person *liubo = [Person new]; Car *bicycle = [Car new];// 1 bicycle.speed = 80; [liubo setCar:bicycle];// 2 [bicycle release];// 1 [liubo setCar:bicycle]; // 访问僵尸对象肯定会崩,你又不能起死回生。。所以要写if那句话 [liubo go]; [liubo release]; } // 类用assign可能会造成野指针和内存泄露的问题 所以要使用retain }Person类:
#import <Foundation/Foundation.h> @class Car; @interface Person : NSObject { Car *_car; } //@property (nonatomic,retain) Car *car; - (void)setCar:(Car *)car; - (void)go; @end #import "Person.h" #import "Car.h" @implementation Person - (void)setCar:(Car *)car{ if (_car != car) { [_car release]; _car = [car retain]; } } - (void)go{ [_car run]; } - (void)dealloc{ [_car release]; NSLog(@"people is over"); [super dealloc]; } @endCar类:
#import <Foundation/Foundation.h> @interface Car : NSObject { int _speed; } - (void)setSpeed:(int)speed; - (void)run; @end #import "Car.h" @implementation Car - (void)setSpeed:(int)speed{ _speed = speed; } - (void)run{ NSLog(@"The car is running 速度:%d.", _speed); } - (void)dealloc{ NSLog(@"%d car is over",_speed); [super dealloc]; } @end在setter 方法中不写_car retain会造成野指针。。。。
1.2. 多态:
Animal *d = [Dog new]; // 多态:没有继承就不能实现多态机制,父类指针可以指向不同的子类对象
1.3. collection:
Person *p = [[Person alloc] init]; // 如果数组创建是用[[NSMutableArray alloc] init],则需要在用完后:对数组进行release NSMutableArray *array = [NSMutableArray array]; // 把对象放到数组中的时候,对象的引用计数会+1 [array addObject:p]; NSLog(@"%lu", p.retainCount); // 结果是:2 // 从数组中移除的时候,引用计数-1 [array removeObject:p]; NSLog(@"%lu", p.retainCount); // 结果是:1 [p release];
集合的内存管理:集合会管理自己的元素
添加对象时,会对这个对象retain一次
移除对象时,会对这个对象release一次
对象销毁时,集合会对集合中包含的所有对象发送一条release消息
add/insert :计数器+1
remove/delete :计数器-1
相关文章推荐
- 关于 error while loading shared libraries: libfaac.so.0: cannot open shared object file: No such fi
- java.lang.String中equals(Object anObject)与compareTo(String anotherString)的区别
- JSONObject
- Xcode中的全局异常断点
- 设计模式之模板方法模式&&迪米特法则(代码Objective-C展示)
- Object类
- OC中id和NSobject区别
- 设计模式-COMMOND PATTERN (ACTIVE OBJECT PATTERN是一种特殊的COMMOND PATTERN)
- objective_c
- objective_c
- Objective-C学习-区别方法isKindOfClass、isMemberOfClass和isSubclassOfClass
- php中将SimpleXMLElement Object转化为普通数组
- Object-c中的+ -号函数
- Objective-C总Runtime的那点事儿(一)消息机制
- Object-C 类,对象,运行时,isa
- Objective-C 对象模型
- OC基础16:复制对象
- 利用QObject反射实现jsonrpc
- Objective-c 语法,类/属性/函数(iOS学习笔记,从零开始。)
- Objective-C中的发通知的(Notification)