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


發佈了44 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章