ary*_*axt 4 c# memory-management objective-c
所以我已经了解了目标C中的内存管理,在使用.net(C#)编程时我从来不需要知道它.但我仍然对如何完成所有事情有一些疑问.
- 如果我们分配一个对象而不释放它,代码是否在目标c中泄漏?
- 为什么C#中没有泄漏?
- 自动垃圾收集的优点和缺点是什么?
- 为什么不在每个分配的对象上使用自动释放(目标C)?
- 是否可以手动处理内存(C#)?所以让我说我实例化一个对象,当我完成后我想释放它,我不想等待垃圾收集器这样做?
它在Objective-C中泄漏,因为Objective-C不对其采取任何操作.它依靠你做所有的工作.它不会在C#中泄漏(更确切地说,在.NET中),因为它使用垃圾收集器来清理不再使用的对象.
垃圾收集的主要优点如上:内存泄漏少得多.(它仍然可能有内存泄漏,例如通过无限期填充列表,但是更难以意外地执行.)过去认为垃圾收集的缺点在于它可能会减慢程序因为它一直在做垃圾在后台收集,你几乎无法控制它.但实际上,差异可以忽略不计:您的计算机上还有其他后台任务(例如设备驱动程序)一直在运行,垃圾收集器也不会破坏骆驼的后退.
自动释放(因为它在非指针变量超出范围时在C++中使用)是危险的,因为即使在处理了对象之后,它也可以使它仍然存在.如果您的代码然后尝试访问该对象,那么该过程将大大增加.
是的,可以通过直接调用垃圾收集器告诉C#释放内存(GC.Collect()
).但是,我还没有看到一个必要的情况.如果实际上内存不足,垃圾收集器将自动启动并尽可能多地释放.
Objective-C不是垃圾收集语言,因此除非你告诉它,否则它无法知道对象将不再被使用.这就是.NET垃圾收集器的目的:它检查程序不能再使用哪些对象,并且 - 在某些时候 - 摆脱它们以释放内存.无法确定何时或是否可以释放任何已放弃的物体; 它只是试图让内存使用失控.
没有垃圾收集器,C#无法释放对象.如果您释放仍在引用的对象,则在尝试使用该程序时,程序将崩溃.这总是存在手动内存管理的风险,但与所有"内存管理语言"一样,它试图阻止您犯下错误.如果要显式关闭对象的操作,请为该对象的类型实现接口IDisposable,并对该对象使用Dispose()方法 - 本质上是析构函数.当然,确保你完成它,并且如果某些东西在Dispose()d之后尝试使用它,那么该对象将表现正确(通过抛出异常).
Objective-C是参考计数.当一个对象没有引用时,它会自行删除.对于"有人还在使用这个对象吗?"这并不是一个糟糕的解决方案.问题,除了引用自己的数据结构; 除非仔细处理,否则循环数据结构将永远存在..NET不是一个引用计数器,因此它将摆脱运行代码无法访问的循环数据结构.
Autorelease只是一个"稍后发布",用于返回一个应该自毁的值,如果抓住它的代码不会立即想要保留它,据我所知.(不过,我不是Objective-C程序员.)它解决了"谁发布这个对象?" 返回对象的调用的问题,而不是在函数完成之前销毁它.但这是一个特殊的用例,在大多数其他情况下它没有意义.
归档时间: |
|
查看次数: |
572 次 |
最近记录: |