oc45--多对象内存管理 优化
//
// main.m
// Set方法的内存管理 #import <Foundation/Foundation.h>
#import "Person.h"
#import "Room.h" int main(int argc, const char * argv[]) { @autoreleasepool {
// 1.创建两个对象
Person *p = [[Person alloc] init];
Room *r = [[Room alloc] init];
r.no = ;
NSLog(@"%lu",[r retainCount]);
// 2.将房间赋值给人
// 人需要使用这间房, 只要人在房间就一定要在
p.room = r; // [p setRoom:r]
p.room = r; // [p setRoom:r]
p.room = r; // [p setRoom:r]
p.room = r; // [p setRoom:r] NSLog(@"%lu",[r retainCount]); [r release]; // 3.换房
Room *r2 = [[Room alloc] init];
r2.no = ;
// 有问题
p.room = r2;
[r2 release]; // 在这行代码之前, 人都没有被释放
NSLog(@"-----"); // 3,人都不在了, 房间也必须销毁
[p release];
}
return ;
}
//
// Person.h #import <Foundation/Foundation.h>
#import "Room.h" @interface Person : NSObject
{
Room *_room;
} - (void)setRoom:(Room *)room;
- (Room *)room;
@end
//
// Person.m #import "Person.h" @implementation Person // 当A对象想使用B对象一定要对B对象进行一次retain, 这样才能保证A对象存在B对象就存在, 也就是说这样才能保证无论在什么时候在A对象中都可以使用B对象
// 当A对象释放的时候, 一定要对B对应进行一次release, 这样才能保证A对象释放了, B对应也会随之释放, 避免内存泄露
// 总结一句话: 有增就有减 - (void)setRoom:(Room *)room // room = r
{
// 只有房间不同才需用release和retain
if (_room != room) {// 0ffe1 != 0ffe1,防止了相同的set会加多次, // 将以前的房间释放掉 -1,更换room的时候将之前的room的计数器减一,
[_room release]; /*
对房间的引用计数器+1
[room retain];
_room = room;
*/ // retain不仅仅会对引用计数器+1, 而且还会返回当前对象
_room = [room retain];
}
} - (Room *)room
{
return _room;
} - (void)dealloc
{
// 人释放了, 那么房间也需要释放
[_room release];
NSLog(@"%s", __func__);
[super dealloc];
}
@end
// Room.h #import <Foundation/Foundation.h> @interface Room : NSObject @property int no;// 房间号 @end
// Room.m #import "Room.h" @implementation Room - (void)dealloc
{
NSLog(@"%s no = %i", __func__, _no);
[super dealloc];
} @end
oc45--多对象内存管理 优化的更多相关文章
- C# 内存管理优化畅想----前言
C#语法简洁.优雅,类库丰富,是我最喜爱的计算机语言,没有“之一”.但是,经过深入学习后发现,C#的内存管理,也就是通常所说的垃圾回收(GC)机制,虽然跟其他支持GC的语言相比,已经很优秀了,但与手动 ...
- EasyDarwin开源流媒体服务器内存管理优化
-本文由EasyDarwin开源团队成员Fantasy贡献 前言 最近在linux上跑EasyDarwin发现一个很奇怪的问题,当有RTSPSession连接上来的时候,发现进程的虚拟内存映射一下就多 ...
- C# 内存管理优化实践
内存优化畅想系列文章已经结束了,很多读者读完之后可能觉得“然并卵”,毕竟都是给微软提的建议而已,现在都没有实现.那么为了优化内存,有没有什么我们现在就能用的技巧呢?我的答案是:有.网上关于.net内存 ...
- C# 内存管理优化畅想(三)---- 其他方法&结语
前两篇文章提出的优化方法,都是不需要修改源代码的,而是在CLR或JIT层面进行自动优化的.但本文中提出的优化方法则需要引入新的语法,开发者只有在源代码中使用了这些新语法,才会获得优化. 1. 允许对象 ...
- C# 内存管理优化畅想(二)---- 巧用堆栈
这个优化方法比较易懂,就是对于仅在方法内部用到的对象,不再分配在堆上,而是直接在栈上分配,方法结束后立即回收,这将大大减轻GC的压力. 其实,这个优化方法就是java里的逃逸分析,不知为何.net里没 ...
- C# 内存管理优化畅想(一)---- 大对象堆(LOH)的压缩
我们都知道,.net的GC是不会压缩大对象堆的,因为其时间开销不可接受,但这是以大对象堆产生大块碎片为代价的,如果以后要分配的大对象比最大的碎片还大,那么即使它比所有碎片的总大小要小,也是无法在不扩展 ...
- 0c-40-ARC下多对象内存管理
1个人拥有1条狗. 问题1:人拥有狗作为成员变量,此时使用weak,释放过程是什么样? Person *p = [Person new]; Dog *d = [Dog new]; //设置人拥有dog ...
- 内存管理 & 内存优化技巧 浅析
内存管理 浅析 下列行为都会增加一个app的内存占用: 1.创建一个OC对象: 2.定义一个变量: 3.调用一个函数或者方法. 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户 ...
- iOS MRC ARC 内存管理
转自:http://www.jianshu.com/p/48665652e4e4 1. 什么是内存管理 程序在运行的过程中通常通过以下行为,来增加程序的的内存占用 创建一个OC对象 定义一个变量 调用 ...
随机推荐
- react杂记
React webpack+react (hello world) 项目结构: src: app.js main.js package.json webpack_dev_config.js 需要安装包 ...
- Android 获取android安装apk框的安装状态(如点击取消、返回)
最近鼓捣android,碰到个问题,因为没有root权限,需要调用Intent安装apk,但需要获取用户是否安装了(如,用户点击了返回或取消),查了很多文章,最后可以解决,但有瑕疵,解决方法如下: p ...
- Mediacodec编码后的h264视频出现马赛克问题
问题:在视频采集后,通过Mediacodec编码生成h264视频文件,播放时出现马赛克较多,无论调整帧率.码率.还是分辨率都不能解决问题 出现问题的原因:编码时传入的时间戳不对.时间戳是视频播放的标准 ...
- Hive扩展功能(四)--HiveServer2服务
软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这五部机, 每部主机的用户名都为centos ...
- Python语言之类
1.一个空类 #Filename : emptyclass.py class Empty: pass e = Empty() print( e ) #<__main__.Empty object ...
- 移动端rem布局 js
// rem布局适配 (function(doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in ...
- 基于fpga的256m的SDRAM控制器
2018/7/26 受教于邓堪文老师,开始真真学习控制sdram 由于自己买的sdram模块是256的,原来老师的是128,所以边学边改,不知道最后好不好使,但是我有信心 一.sdram的初始化 sd ...
- Django - 数据获取
Django - 数据获取 1.radio值获取 2.checkbox获取 3.select 获取 select 获取值,需要根据前端multiple来获取,get or getlist; 4.上传文 ...
- 使用Python的Flask框架,结合Highchart,动态渲染图表
服务端动态渲染图表 参考文章链接:https://www.highcharts.com.cn/docs/dynamic-produce-html-page 参考文章是使用php写的,我这边改用pyth ...
- 17.使用原生cross-fiels技术解决搜索弊端
主要知识点: 原生cross-fiels的用法 原生cross-fiels解决三个弊端 一.原生cross-fiels的用法 GET /forum/article/_search { ...