我不明白如何给阵列提供弱参考或释放数组的已分配内存,有人能告诉我如何解决这个漏洞吗?
var menuDetails:[[String:Any]] = []//this my global array object
即使我使用ARC也会出现以下泄漏。
数据内存泄漏的屏幕截图!
我只是害怕内存泄漏,任何人都可以告诉我该如何修复它?
答案 0 :(得分:3)
您不想使用弱引用。如果这样做,您的阵列将立即释放。
weak var weakArray:[[String:Any]]? = []
创建后会立即包含nil。
相反,您应该在完成内容后将数组设置为nil(或为空):
您可以使用`menuDetails.removeAll()删除数组中的所有条目,或者您可以更改声明以使其成为可选
var menuDetails:[[String:Any]]? = []//this my global array object
然后当你完成它时将其设置为nil:
menuDetails = nil
答案 1 :(得分:0)
只有在另一个对象具有强引用对象时,才会保留该对象。一旦视图控制器消失,它很可能也会被释放,这会自动删除对其他对象的强引用。因此,如果imageArray仅被消失的视图控制器强烈引用,则内存将自动释放。您不需要使用autoreleasepool。
答案 2 :(得分:0)
为了在数组和/或字典中存储弱引用,您需要一个中间结构。
例如:
struct WeakRef
{
weak var object:AnyObject?
init( _ objectRef:AnyObject?)
{ object = objectRef }
}
// use WeakRef when you add object instances to your dictionary (or array)
menuDetails[0]["objectKey"] = WeakRef(yourObject)
// you will need additional code to get the actual object out of the intermediate structure
// and given that it is a weak reference you'll also need to deal with its optionality.
if let yourObject = (menuDetails[0]["objectKey"] as? WeakRef)?.object as? YourClass,
{
// ... do your thing with your object ...
}
通过将其包含在自定义运算符和泛型中,可能会使语法更清晰,但这是它的一般方法。