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的更多相关文章

  1. 讲讲你不知道的 ARC (一)

    来源:伯乐在线 - 酷酷的哀殿 链接:http://ios.jobbole.com/89420/ 点击 → 申请加入伯乐在线专栏作者 内容提要 通过阅读本篇文章,希望您能了解:如何在 ARC 下,强制 ...

  2. 或许你不知道的10条SQL技巧(转自58沈剑原创)

    这几天在写索引,想到一些有意思的TIPS,希望大家有收获. 一.一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order where status!=0 and s ...

  3. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数016,xld,xld轮廓

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数016,xld,xld轮廓 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“ ...

  4. 【Bugly干货分享】iOS内存管理:从MRC到ARC实践

    Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...

  5. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数012,polygon,多边形

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数012,polygon,多边形 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换 ...

  6. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数003·contour,轮廓处理

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数003·contour,轮廓处理 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替 ...

  7. ios5之后arc的问题

    原创: 自从ios5以后, apple官方引进了ARC (automaically reference count 自动索引计数) 这个新特性, 简单的说就是对象设置为nil(空引用)之后, 当自动索 ...

  8. iOS开发中 在MRC中让某些类使用ARC编译 或者相反

    如果你的工程是MRC 想让某些类使用ARC进行编译的话 那么需要在Build Phases中Complile Sourse 把该类后面 写上如下命令:-fobjc-arc  反之 写上如下命令:-fn ...

  9. 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版

    <zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...

随机推荐

  1. 【转】JCR期刊分区及其检索方法

    不少机构依据JCR期刊分区制定科研激励政策,相关科研工作者及科研管理机构密切关注JCR期刊分区及其检索方法.本文作一粗略介绍.    关于JCR(Journal Citation Reports,期刊 ...

  2. [Angularjs] 第一步开始一个项目

    [Angularjs] 第一步开始一个项目 一.什么是angularjs angularjs是2009年兴起的,目前由Google维护一个采用mvc模式的js框架,很多时候用来创建单页面应用.我也经常 ...

  3. 【转】JS获取浏览器可视区域的尺寸

    from: http://www.xiaoboy.com/detail/1341545044.html 所谓可视区域是指能看得见的区域,即在浏览器中能看到页面的区域(高度与宽度).刚刚使用 docum ...

  4. Scala学习笔记——内建控制结构

    Scala的内建控制结构包括:if.while.for.try.match和函数调用 1.if表达式 //常见的写法 var filename = "name" if (!args ...

  5. Ubuntu:双(多)网卡绑定(bonding)配置

    step 0:安装网卡绑定的功能 apt-get install    ifenslave step 1:加载内核模块:编辑 /etc/modules,添加: bonding step 2:编辑网卡配 ...

  6. extern、static、restrict、volatile 关键字

    extern extern的两个作用: 修饰变量或函数,提示编译器此变量或函数是在其它文件中定义的,但要在此处引用: 进行链接指定,如: extern "C" void fun(i ...

  7. ng4.0 生命周期

    名称 时机 接口 范围 ngOnChanges 当被绑定的输入属性的值发生变化时调用,首次调用一定会发生在 ngOnInit之前. OnChanges 指令和组件 ngOnInit 在第一轮 ngOn ...

  8. Linux Platform驱动模型(三) _platform+cdev

    平台总线是一种实现设备信息与驱动方法相分离的方法,利用这种方法,我们可以写出一个更像样一点的字符设备驱动,即使用cdev作为接口,平台总线作为分离方式: xjkeydrv_init():模块加载函数 ...

  9. Phoenix系列:二级索引(1)

    Phoenix使用HBase作为后端存储,对于HBase来说,我们通常使用字典序的RowKey来快速访问数据,除此之外,也可以使用自定义的Filter来搜索数据,但是它是基于全表扫描的.而Phoeni ...

  10. E - 487--3279

    Businesses like to have memorable telephone numbers. One way to make a telephone number memorable is ...