今天和Delphi高手刘麻子讨论了一下移动平台上生存期自管理容易导致的一些问题.有几点体会
在移动平台上Delphi的对象是生存期自管理的,这和早期版本和现有的PC版本有很大不同.
大部分时间我们原来的代码不会有问题.我们原来的手动释放代码在移动平台也不会有问题,因为TObject.Free方法在移动平台上就是个摆设.
procedure TObject.Free; begin // under ARC, this method isn't actually called since the compiler translates // the call to be a mere nil assignment to the instance variable, which then calls _InstClear {$IFNDEF AUTOREFCOUNT} if Self <> nil then Destroy; {$ENDIF} end;
真正调用到对象的Destroy的只有编译器自动产生的代码.
一般有两种情况.
1. :=也就是赋值,会调用旧的变量内容的__ObjRelease减少引用计数,会调用新变量内容的__ObjAddRef增加引用计数.
2.当变量销毁时,如局部变量离开函数恢复栈的时候,如成员变量在对象的销毁时候.会调用变量内容的__ObjRelease减少引用计数.
当引用计数减到0的时候会调用到Destroy或FreeInstance真正的释放对象.
另外还有一个特殊的Attribute名字叫WeakAttribute.如果变量被[weak]修饰,那么编译器在处理这个变量的时候不会调用该变量内容的__ObjAddRef和__ObjRelease.
一切看起来都挺顺利的.但是我们的旧代码移植到移动平台上还是会有对象在我们不希望它释放的时候被释放了,导致地址出错等莫名其妙的问题.
为什么呢,因为Delphi是一种支持指针的语言.但是指针和靠引用计数生存期自管理简直是水火不相容.
比如我们把对象赋值给指针保管,然后旧的对象变量销毁的时候对象有可能就被释放.我们再用指针操作该对象的时候地址已经是无效的了.
比如我们使用Classes单元的TList而不是泛型的TList<T>来保管对象,这种代码在旧的Delphi代码中非常常见.
Classes单元中的TList是个指针的容器,就非常容易导致上面说的问题.
怎么办呢?
有一个无赖的办法.
对象在赋值给指针之前手动调用一下__ObjAddRef方法,给他的引用计数加一.这样编译器产生的生存期自管理代码就永远不会把该对象的引用计数减到零来释放了.
然后在指针变量销毁前,或者赋值别的内容前手工调用一下__ObjRelease.
比如给上面说的TList增加对象前,为防止对象被释放要调用一下对象的__ObjAddRef,响应的,在恰当的时候要调用一下__ObjRelease.
本来以为这个方法有点无赖了,发现易博龙本身RTL中也是这样的做的.嘿嘿.
class function TEncoding.GetANSI: TEncoding; var LEncoding: TEncoding; begin if FANSIEncoding = nil then begin LEncoding := TMBCSEncoding.Create(GetACP, 0, 0); if AtomicCmpExchange(Pointer(FANSIEncoding), Pointer(LEncoding), nil) <> nil then LEncoding.Free; {$IFDEF AUTOREFCOUNT} FANSIEncoding.__ObjAddRef; //<------瞧,易博龙和我们一样"无赖" {$ENDIF AUTOREFCOUNT} end; Result := FANSIEncoding; end; class destructor TEncoding.Destroy; begin FreeEncodings; //销毁代码 end; class procedure TEncoding.FreeEncodings; begin FreeAndNil(FANSIEncoding); FreeAndNil(FASCIIEncoding); FreeAndNil(FUTF7Encoding); FreeAndNil(FUTF8Encoding); FreeAndNil(FUnicodeEncoding); FreeAndNil(FBigEndianUnicodeEncoding); end; procedure FreeAndNil(var Obj); {$IF not Defined(AUTOREFCOUNT)} var Temp: TObject; begin Temp := TObject(Obj); Pointer(Obj) := nil; Temp.Free; end; {$ELSE} begin TObject(Obj) := nil; //这个等价于TObject(Obj).__ObjRelease; Obj:=nil; end; {$ENDIF}
最后说一句,手动调用__ObjAddRef/__ObjRelease是没办法的时候做的.说句祝福:希望大家在移植旧代码到移动平台的时候都不要遇到对象生存期自管理和旧代码的兼容问题,不要被迫使用这个办法.
现在还没有开始搞移动的开发
不过这个事情,跟直接用interface的方式一样了..
不过自+1先,确实是比较无赖的方式。
好多年没见过A3了,我现在也在上海
Delphi的移动开发已经在在尝试了.
你在上海哪里啊.有空碰碰
看这趋势应该快把 ObjectiveC 的 ARC (Auto reference couting) 搬过来啦, 只是搬的还不完整,未来加入”所有权修饰符”,比如 __weak , __strong, __autoreleasing 。 这样就可以完全依赖编译器来管理引用计数了,然后就要考虑以前的类库怎么兼容的问题了。
非常不喜欢这个特性. EMB 就非要这样不可吗?
导致大量的老代码都变得不可靠, 全部抄出来, 重新测试和修改.
这个可不是一般的工作量.
其实我还是觉得,应该把
TList变为TList,手动加引用计数是可以的,但感觉不规范而已。呵呵
奇怪,TList改为TList《TObject》,貌似打不上尖括号符号
Pingback引用通告: 43ytr.icu/j/GPoAr
Pingback引用通告: Èãðà ïðåñòîëîâ 8 ñåçîí Ëîñòôèëüì
Pingback引用通告: Èãðà ïðåñòîëîâ 8 ñåçîí
Pingback引用通告: glyxar.ru
Pingback引用通告: abisko.ru
Pingback引用通告: 2021
Pingback引用通告: ðîêåòìåí
Pingback引用通告: wwin-tv.com
Pingback引用通告: Video
Pingback引用通告: Watch
Pingback引用通告: watch online
Pingback引用通告: 00-tv.com
Pingback引用通告: 4serial.com
Pingback引用通告: tureckie_serialy_na_russkom_jazyke
Pingback引用通告: tureckie_serialy
Pingback引用通告: serialy
Pingback引用通告: +1+
Pingback引用通告: æóêè+2+ñåðèÿ
Pingback引用通告: Ñìîòðåòü ñåðèàëû îíëàéí âñå ñåðèè ïîäðÿä
Pingback引用通告: Ñìîòðåòü âñå ñåðèè ïîäðÿä
Pingback引用通告: âûòîïêà âîñêà
Pingback引用通告: ++++++
Pingback引用通告: HD-720
Pingback引用通告: guardians+of+the+galaxy+2
Pingback引用通告: strong woman do bong soon
Pingback引用通告: my id is gangnam beauty
Pingback引用通告: guardians of the galaxy vol 2
Pingback引用通告: 2020
Pingback引用通告: kpop+star+season+6+ep+9
Pingback引用通告: 1 2 3 4 5 6 7 8 9 10
Pingback引用通告: Kinokrad 2019 Kinokrad Hd
Pingback引用通告: Kinokrad
Pingback引用通告: filmy-kinokrad
Pingback引用通告: kinokrad-2019
Pingback引用通告: filmy-2019-kinokrad
Pingback引用通告: serial
Pingback引用通告: cerialest.ru
Pingback引用通告: youtube2019.ru
Pingback引用通告: dorama hdrezka
Pingback引用通告: movies hdrezka
Pingback引用通告: HDrezka
Pingback引用通告: kinosmotretonline
Pingback引用通告: LostFilm HD 720
Pingback引用通告: trustedmdstorefy.com
Pingback引用通告: bofilm ñåðèàë
Pingback引用通告: bofilm
Pingback引用通告: 1 seriya
Pingback引用通告: Êîíñóëüòàöèÿ ïñèõîëîãà
Pingback引用通告: topedstoreusa.com
Pingback引用通告: hqcialismht.com
Pingback引用通告: viagramdtrustser.com
Pingback引用通告: rick and morty season 3
Pingback引用通告: See-Season-1
Pingback引用通告: Evil-Season-1
Pingback引用通告: Evil-Season-2
Pingback引用通告: Evil-Season-3
Pingback引用通告: Evil-Season-4
Pingback引用通告: Dollface-Season-1
Pingback引用通告: Queer-Eye-We-re-in-Japan-Season-1
Pingback引用通告: serial 2020
Pingback引用通告: Dailymotion
Pingback引用通告: Watch+movies+2020
Pingback引用通告: Netflix Original Movies
Pingback引用通告: serial-video-film-online
Pingback引用通告: tvrv.ru
Pingback引用通告: 1plus1serial.site
Pingback引用通告: #1plus1
Pingback引用通告: 1plus1
Pingback引用通告: Watch Movies Online
Pingback引用通告: Film
Pingback引用通告: Film 2020
Pingback引用通告: Film 2021
Pingback引用通告: watch online TV LIVE 2020
Pingback引用通告: parazity-oskar-2020
Pingback引用通告: human design
Pingback引用通告: DSmlka
Pingback引用通告: viagra
Pingback引用通告: viagra online
Pingback引用通告: +
Pingback引用通告: ¯jak Son³k
Pingback引用通告: astrolog
Pingback引用通告: film-kalashnikov-watch
Pingback引用通告: generic cialis
Pingback引用通告: cialis online
Pingback引用通告: pobachennya u vegas
Pingback引用通告: Proshanie so Stalinym
Pingback引用通告: strelcov 2020
Pingback引用通告: t-34
Pingback引用通告: online pharmacy
Pingback引用通告: canadian pharmacy
Pingback引用通告: Beograd film 2020
Pingback引用通告: psiholog
Pingback引用通告: psixolog
Pingback引用通告: psyhelp_on_line
Pingback引用通告: coronavirus
Pingback引用通告: PSYCHOSOCIAL
Pingback引用通告: rasstanovka hellinger
Pingback引用通告: Cherekasi film 2020
Pingback引用通告: film doktor_liza
Pingback引用通告: djoker film
Pingback引用通告: t.me/psyhell
Pingback引用通告: Ïñèõîëîã îíëàéí
Pingback引用通告: bitly.com
Pingback引用通告: viagra 100mg
Pingback引用通告: viagra price
Pingback引用通告: viagra generic
Pingback引用通告: viagra coupon
Pingback引用通告: cheap viagra
Pingback引用通告: cialis
Pingback引用通告: cialis coupon
Pingback引用通告: canadian pharmacy cialis
Pingback引用通告: cialis 5mg
Pingback引用通告: rlowcostmd.com
Pingback引用通告: bitly
Pingback引用通告: movies-tekstmovies-tekst
Pingback引用通告: Zemlyane 2005 smotret onlajn
Pingback引用通告: smotret onlajn besplatno v kachestve hd 1080
Pingback引用通告: gusmeasu.com
Pingback引用通告: movies-unhinged-film
Pingback引用通告: malenkie-zhenshhiny-2020
Pingback引用通告: dom 2
Pingback引用通告: zoom-psykholog
Pingback引用通告: zoom-viber-skype
Pingback引用通告: Vratar Galaktiki Film, 2020
Pingback引用通告: Vratar
Pingback引用通告: Cherkassy 2020
Pingback引用通告: chernobyl-hbo-2019-1-sezon
Pingback引用通告: moskva-psiholog
Pingback引用通告: batmanapollo.ru
Pingback引用通告: 323
Pingback引用通告: 525
Pingback引用通告: dom2-ru
Pingback引用通告: Tenet Online
Pingback引用通告: psy psy psy psy
Pingback引用通告: krsmi.ru
Pingback引用通告: like-v.ru
Pingback引用通告: CFOSPUK
Pingback引用通告: MAMprEj
Pingback引用通告: fgu0ygW
Pingback引用通告: batmanapollo
Pingback引用通告: tsoy
Pingback引用通告: 44548
Pingback引用通告: 44549
Pingback引用通告: hod-korolevy-2020
Pingback引用通告: HD
Pingback引用通告: 158444
Pingback引用通告: groznyy-serial-2020
Pingback引用通告: 38QvPmk
Pingback引用通告: bitly.com/doctor-strange-hd
Pingback引用通告: bitly.com/eternals-online
Pingback引用通告: bitly.com/maior-grom
Pingback引用通告: matrica-film
Pingback引用通告: dzhonuikfilm4
Pingback引用通告: bitly.com/batman20212022
Pingback引用通告: bitly.com/venom-2-smotret-onlajn
Pingback引用通告: bitly.com/nevremyaumirat
Pingback引用通告: bitly.com/kingsmankingsman
Pingback引用通告: bitly.com/3zaklyatie3
Pingback引用通告: bitly.com/1dreykfilm
Pingback引用通告: bitly.com/topgunmavericktopgun
Pingback引用通告: bitly.com/flash2022
Pingback引用通告: bitly.com/fantasticheskietvari3
Pingback引用通告: bitly.com/wonderwoman1984hd
Pingback引用通告: 1444
Pingback引用通告: cleantalkorg2.ru
Pingback引用通告: 232dfsad
Pingback引用通告: cleantalkorg2.ru/sitemap.xml
Pingback引用通告: join vk
Pingback引用通告: vk login
Pingback引用通告: svaty7sezon
Pingback引用通告: svaty 7 sezon
Pingback引用通告: svaty 7
Pingback引用通告: tik tok
Pingback引用通告: 666
Pingback引用通告: The Revenant
Pingback引用通告: 2021
Pingback引用通告: D4
Pingback引用通告: 777
Pingback引用通告: link
Pingback引用通告: 4569987
Pingback引用通告: news news news
Pingback引用通告: psy
Pingback引用通告: psy2022
Pingback引用通告: projectio-freid
Pingback引用通告: kinoteatrzarya.ru
Pingback引用通告: topvideos
Pingback引用通告: afisha-kinoteatrov.ru
Pingback引用通告: Ukrainskie-serialy
Pingback引用通告: site
Pingback引用通告: top
Pingback引用通告: soderzhanki-3-sezon-2021.online