我在 iOS 下,正在使用 delphi Tokyo 进行开发,这是我的代码:
aUIImage := TUIImage.Wrap(TUIImage.alloc.initWithCGImage(aCGImageRef));
try
aData := TNSData.Wrap(UIImageJPEGRepresentation((aUIImage as ILocalObject).GetObjectID, cWin_DefaultJPGCompressionRate / 100));
try
aWorkPicStream.WriteBuffer(aData.bytes^, aData.length);
finally
aData.release; // << this make my code will crash (later not now)
end;
finally
aUIImage.release;
end;
执行代码后,稍后在执行中出现此错误:
myproj [E][W][I][D][V] Error => Access violation at address 0000000184D4891C, accessing address 0000000107FD286C
At address: $0000000184D4891C (objc_msgSend + 28)
Call stack:
myproj $0000000103E00548 Grijjy.Errorreporting.TgoExceptionReporter.GlobalGetExceptionStackInfo(TExceptionRecord*) + 196
myproj $00000001030DF0EC Sysutils.Exception.RaisingException(TExceptionRecord*) + 88
myproj $0000000103116164 Sysutils.RaiseExceptObject(TExceptionRecord*) + 84
myproj $00000001030BB498 _RaiseAtExcept(TObject*, Pointer) + 128
myproj $00000001030DD900 Internal.Excutils.SignalConverter(NativeUInt, NativeUInt, NativeUInt) + 68
libobjc.A.dylib $0000000184D5213C <redacted> + 844
CoreFoundation $0000000185A40AAC _CFAutoreleasePoolPop + 28
Foundation $00000001864FB960 <redacted> + 148
myproj $00000001031B426C Classes.ThreadProc(Classes.TThread*) + 948
myproj $00000
如果我评论该行aData.release;
那么我就不会遇到任何错误。
为什么 ?如何知道什么时候必须调用release,什么时候不能调用release?
iOS 的 ARC 规则相当简单,如下所示Apple 的基本内存管理规则 https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html.
名称开头为的方法alloc
, new
, copy
, or mutableCopy
不需要致电retain
。相反,如果你调用它,就会造成内存泄漏,因为会有一个retain
太多。但他们确实需要release
or autorelease
。这些对象实例是您创建的,在 Objective-C 下,它们在构造时会自动保留。
aUIImage
是使用构造的alloc
,你拥有它并且你有责任释放它release
。另一方面你并不拥有aData
并将由系统处理。
另一件要记住的事情是,对于您不拥有的对象,您可能需要同时调用retain
and release
只要您正在使用它,就可以使对象实例保持活动状态。由于接收到的对象通常保证在接收它的方法中保持有效,因此您不必调用retain
and release
upon aData
在你的代码中。
The retainCount
方法返回 Objective-C 对象实例的当前引用计数。这个数字纯粹是提供信息,在 iOS 或 macOS 下没有调试价值,但它足以显示 Objective-C 和 Delphi 内存管理之间的交互,并且有时会有所帮助。
来自苹果文档关于保留计数 https://developer.apple.com/documentation/objectivec/1418956-nsobject/1571952-retaincount?language=objc:
retainCount
- 不要使用此方法
此方法对于调试内存管理问题没有任何价值。
因为任意数量的框架对象都可能保留了一个对象
为了保存对它的引用,同时自动释放
池可以在对象上保存任意数量的延迟释放,它
您不太可能从该方法中获得有用的信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)