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];
}
@end
Car类:
#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