Objective-C---9---内存管理 补充
发布日期:2022-02-08 18:03:23 浏览次数:46 分类:技术文章

本文共 2586 字,大约阅读时间需要 8 分钟。

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 
@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 
@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

转载地址:https://blog.csdn.net/Evelynzn/article/details/48997273 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Objective-C---9---内存管理
下一篇:UI-UIView

发表评论

最新留言

不错!
[***.144.177.141]2024年04月05日 17时24分16秒