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

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];
}
@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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: