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类:
#importCar类:@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
#import在setter 方法中不写_car retain会造成野指针。。。。@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
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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年04月05日 17时24分16秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
spring boot 2.x 接口返回时间类型不再自动序列化为timestamp
2021-06-30
Ubuntu Linux 创建root用户并且允许远程登录
2021-06-30
Linux shell 关于 2>&1 的含义
2021-06-30
Ubuntu Linux系统使用apt-get install安装的软件的相关位置
2019-04-27
nginx同一server配置多个前端工程location访问404问题
2019-04-27
Java 多线程与高并发
2019-04-27
第二章 Springboot 自定义banner图案
2019-04-27
第三章 Springboot 热部署
2019-04-27
Log4j格式化符号%详解
2019-04-27
Logback日志添加唯一追踪ID
2019-04-27
Spring IOC 容器源码分析
2019-04-27
Java 生成 UUID
2019-04-27
Git使用教程:最详细、最傻瓜、最浅显、真正手把手教!
2019-04-27
jdk1.8 源码 (包含sun包)
2019-04-27
Java 集合框架源码解读之Vector
2019-04-27
静态代理,JDK动态代理,Cglib动态代理详解
2019-04-27
Redis入门到超神 - 01 Redis介绍与安装
2019-04-27
Redis入门到超神 - 02 Redis为什么默认16个数据库
2019-04-27
Redis入门到超神 - 03 redis.conf配置文件详解
2019-04-27
Redis入门到超神 - 04 redis的5种数据结构
2019-04-27