LEO原创-FMX之你不知道的ARC

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wingleo/article/details/88842762

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讨论。

展开阅读全文

[原创&交流]你可能不知道Windows系统下有一个UNIX子系统

06-09

来源:http://www.cnblogs.com/clever101/admin/EditPosts.aspx?opt=1rnrn请看下面一段代码:rnrn[code=C/C++]rn#include rn#include rn#include rn#include rn#include rnrnint main( void )rnrn struct _stat buf;rn int result;rn char timebuf[26];rn char* filename = "F:\\MyTest\\MyTest\\src\\TestUnix\\stdafx.h";rn errno_t err;rnrn // Get data associated with "crt_stat.c": rn result = _stat( filename, &buf );rnrn // Check if statistics are valid: rn if( result != 0 )rn rn perror( "Problem getting information" );rn switch (errno)rn rn case ENOENT:rn printf("File %s not found.\n", filename);rn break;rn case EINVAL:rn printf("Invalid parameter to _stat.\n");rn break;rn default:rn /* Should never be reached. */rn printf("Unexpected error in _stat.\n");rn rn rn elsern rn // Output some of the statistics: rn printf( "File size : %ld\n", buf.st_size );rn printf( "Drive : %c:\n", buf.st_dev + 'A' );rn err = ctime_s(timebuf, 26, &buf.st_mtime);rn if (err)rn rn printf("Invalid arguments to ctime_s.");rn return 1;rn rn printf( "Time modified : %s", timebuf );rn rnrn getchar();rn return 0;rnrnrn[/code]rnrn 熟悉unix或linux平台开发的朋友可能以为它是在unix或linux平台开发的。实际上它是MSDN Library for Visual Studio 2005上的一个例子,可以在VS C++ 2005上成功编译(多字节字符集编译)。rnrn开始我也不太明白为何Windows系统有unix的头文件。最近看了《Windows操作系统原理》才彻底明白了。究其原因,Windows 2000/XP有三种环境子系统:POSIX/UNIX、OS/2和Win32(OS/2只能用于x86系统)。因为有了POSIX/UNIX这个子系统,自然也就有了一个UNIX SDK,所以出现上面的头文件就不足为奇了。事实上微软的发展和unix系统是有一些渊源的:微软历史上曾推出过unix操作系统;windows系统的很多核心开发人员都是资深的unix操作系统的设计和开发人员。rnrn那么这个POSIX/UNIX这个子系统有什么用呢?POSIX代表了UNIX类型的操作系统的国际标准集,它鼓励制造商实现兼容的UNIX风格接口,以使编程者很容易地将他们的应用程序从一个系统移到另一个系统。正因为具有这个特点,很多软件底层(想实现跨平台)、跨平台库喜欢调用UNIX SDK中的函数。我在著名的开源图像库GDAL就见过UNIX SDK中的函数。不过Windows 2000/XP只实现了POSIX.1标准(ISO/IEC 9945-11990或IEEE POSIX 1003.1-1990)。所需的POSIX一致性文档位于Platform SDK中的\HELP目录中。rnrn参考文献:rn1. MSDN Library for Visual Studio 2005,Microsoft Corporationrn2. 《Windows操作系统原理》,尤晋元 史美林 陈向群 向勇 王雷 马洪兵 郑扣根 马洪兵 编著rn 论坛

没有更多推荐了,返回首页