LEO原创-FMX之你不知道的ARC
LEO原创13498714
FMX加入了ARC技术,对象创建后不用释放,FMX会帮你释放,是不是这样就不用关心对象的释放了呢,非也!
写简单的代码,这个功能也许很好用,但如果你写的是一个项目,那隐藏的坑无形中大大的增加开发难度,
开发人员需要更加小心注意对象的释放问题:你原来正常运作的代码,在FMX下,极有可能运作不正确,灵异现象熊出落。
原因很简单:对象的释放和你想象的不一样。怎么个不一样,(关于ARC)仔细看他Object类,就能窍的一二,这一二容我细细道来:
之前我们写代码,关系对象引用的清除以及释放一般都是在Detory事件中处理,所以代码是
obj:TObject.Create; obj.Free; Free中调用了Destory
如果使用接口Interface, 由于引用计数关系,引用计数FRefCount值为0时,编译器帮我们释放了对象(最终调用了Desotry)
某个Firemonkey设计者,在设计ARC时,大胆简单的使用了接口相同的技术(引用计数),所以释放的原理和原来的接口一样。但原来的Free代码和引用计数的这个设计是矛盾的,所以高明的设计者在FMX中,直接加上了一个补丁:如果使用了ARC,Free函数啥都不作。
LEO原创13498714
这是一个简单的设计,同时这也是一个恶心的设计,这设计最大的危害:以前的代码直接就有了接口的原罪与缺点:对象相互引用时(你中有我,我中有心),一不小心对象的Desotry就得不到调用(因为二者的引用计数都无法顺序归0)。原来写的无害代码,极有可能会出现对象得不到释放。得不到释放会引来很多问题,因为不严谨,对象还可以接收处理,如果是窗体得不到释放,可能还在后面做着啥(这也是FMXApp容易闪退的一个常见原因)
这个时候,我大胆猜测,这个伟大的设计人员见招拆招,想出增加一个DisposeOf方法出来,你不是无法正常释放吗,好吧,把这个事分成二部分来看,一个对象的销毁Desotry,一个是对象内存的释放(FreeInstance),完美!打个补丁,就可以解决你原来的问题,你原来写的代码,写成obj:TObject.Create; obj.DisposeOf;就可以和原来效果基本一样了,为什么说是基本一样呢,至少你的Desotry函数能被顺利调用,不一样的地方就是,有可能这块内存得不到释放而已(Destory后,对象引用计数还是很容易不为0的)
好了,分析完ARC的前因后果之后,我们在写FMX代码的时候,就容易多了,至少知道坑在那里,下一章,我将总结出开发细节规范,只供参考. 如果有问题可以找13498714讨论。
---------------------
作者:Im_Leo
来源:CSDN
原文:https://blog.csdn.net/wingleo/article/details/88842590
版权声明:本文为博主原创文章,转载请附上博文链接!
LEO原创-FMX之你不知道的ARC的更多相关文章
- 讲讲你不知道的 ARC (一)
来源:伯乐在线 - 酷酷的哀殿 链接:http://ios.jobbole.com/89420/ 点击 → 申请加入伯乐在线专栏作者 内容提要 通过阅读本篇文章,希望您能了解:如何在 ARC 下,强制 ...
- 或许你不知道的10条SQL技巧(转自58沈剑原创)
这几天在写索引,想到一些有意思的TIPS,希望大家有收获. 一.一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order where status!=0 and s ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数016,xld,xld轮廓
<zw版·Halcon-delphi系列原创教程> Halcon分类函数016,xld,xld轮廓 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“ ...
- 【Bugly干货分享】iOS内存管理:从MRC到ARC实践
Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数012,polygon,多边形
<zw版·Halcon-delphi系列原创教程> Halcon分类函数012,polygon,多边形 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换 ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数003·contour,轮廓处理
<zw版·Halcon-delphi系列原创教程> Halcon分类函数003·contour,轮廓处理 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替 ...
- ios5之后arc的问题
原创: 自从ios5以后, apple官方引进了ARC (automaically reference count 自动索引计数) 这个新特性, 简单的说就是对象设置为nil(空引用)之后, 当自动索 ...
- iOS开发中 在MRC中让某些类使用ARC编译 或者相反
如果你的工程是MRC 想让某些类使用ARC进行编译的话 那么需要在Build Phases中Complile Sourse 把该类后面 写上如下命令:-fobjc-arc 反之 写上如下命令:-fn ...
- 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版
<zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...
随机推荐
- 【iCore1S 双核心板_ARM】例程七:通用定时器实验——定时点亮LED
实验原理: 通过STM32的三个GPIO口来驱动LED灯的三个通道:设定GPIO为推挽 输出模式,采用灌电流的方式与LED连接,输出高电平LED灭,输出低电平 LED亮,通过通用定时器TIM3实现50 ...
- 第三百九十四节,Django+Xadmin打造上线标准的在线教育平台—Xadmin后台进阶开发配置2,以及目录结构说明
第三百九十四节,Django+Xadmin打造上线标准的在线教育平台—Xadmin后台进阶开发配置2,以及目录结构说明 设置后台列表页面可以直接修改字段内容 在当前APP里的adminx.py文件里的 ...
- 【Oracle】ORA 01810 格式代码出现两次-转
一.Oracle中使用to_date()时格式化日期需要注意格式码 如:select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mm:ss') fr ...
- 很好的git教程
http://www.liaoxuefeng.com/这里的git教程很好,我是从这入的门.
- pixmap和label设置图片自适应大小
在label中添加pixmap来显示图片时,当图片过大时图片显示不全. 1.这时可以使用pixmap的scared()方法,来设置图片缩放. QPixmap QPixmap.scaled (self, ...
- 《Python3网络爬虫开发实战》
推荐:★ ★ ★ ★ ★ 第1章 开发环境配置 第2章 网页基础知识 第3章 网络爬虫基础 第4章 基本库的使用 第5章 解析库的使用 第6章 数据存储 第7章 Ajax数据爬取 第8章 动态渲染页面 ...
- LostRoutes项目日志——编辑project.json
第一个Scene编译后运行会报错: Uncaught TypeError: Cannot read property 'style' of null 这是因为没有在project.json中包含已经编 ...
- C#自定义按钮、自定义WinForm无边框窗体、自定义MessageBox窗体
C#自定义按钮.自定义WinForm无边框窗体.自定义MessageBox窗体 C#自定义Button按钮控件 效果展示 C#自定义Winform无边框窗体 效果展示 C#自定义无边框MessageB ...
- Go语言学习笔记1
1.Go语言环境搭建及基础知识 Go语言官方网站(http://golang.org) 代码包文档网站(http://godoc.org) Go语言中文网(http://studygolang.com ...
- Android定时执行和停止某任务
一.定义全局变量 int runCount = 0;// 全局变量,用于判断是否是第一次执行 Handler handlerCount = new Handler(); 二.创建Runnable Ru ...