gpt4 book ai didi

ios - ARC内存管理: @Property (nonatomic,强)VS实例变量

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:17:35 27 4
gpt4 key购买 nike

我使用 Xcode 中的分析工具(分配)发现的是,当您清零一个属性时,它不会被释放,直到父类被清空。现在假设你想确保你不会在内存中保留一个昂贵的模态视图 Controller (假设它不会经常使用),如果昂贵的 VC 是一个属性,那么为该属性分配的内存将不会当属性用完时被释放,这意味着当用户想再次使用昂贵的 VC 时,我们每次都会分配相同数量的内存。这很容易在分析器中发现,因为图表一直在攀升。

但是,如果我只将昂贵的 VC 定义为一个实例变量并定义我自己的 setter 和 getter,那么当变量被清空并在每次新分配时以相同的数量返回时,分析器分配图实际上会立即减少。

所以我的问题是,为什么变量在定义为实例变量时“似乎”被释放,但在定义为属性时却没有?

// What I call defining something as an instance variable:
@interface SomeViewController ()
{
UIPopoverController *somePopover;
}

// What I call defining something as a property
@property (nonatomic,strong) UIPopoverController *somePopover;

// Nilling out a property which does not get allocated unless it does not have a parent (root node memory graph wise)
self.somePopover = nil;

// Nilling out an instance variable which does make the memory graph in the profiler go down by the same amount it went up
somePopover = nil;

据我所知,你不能强制一个对象释放它的所有内存,直到它的父调用解除分配,于是它的所有子对象都被级联解除分配。 https://stackoverflow.com/a/7631831/2536815

最佳答案

我认为您的分析不正确。如果使用得当,属性和实例变量对引用计数的影响相同:将其设置为 nil 会减少引用计数器,如果它变为 0,实例(无论是 View Controller 还是其他东西)立即被释放。

如果您的应用不是这种情况,那么原因一定不是属性与实例变量。

为了进一步分析您的具体问题,我们需要更多信息。因此,请发布您的代码,描述用于测量内存管理效果的设置、有效结果是什么以及您期望的结果。

关于ios - ARC内存管理: @Property (nonatomic,强)VS实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18672697/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com