Objective-C---9---内存管理 补充

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值