带有来自XIB的ARC类的IOS 6.1没有得到Deallocated,UIClassSwapper

ort*_*t11 8 xib ios automatic-ref-counting

有一个有趣的问题,其中有一个类在XIB布局(UIScrollView的子类)中引用,并且没有根据Instruments/Allocations进行解除分配,并且不会破坏它的dealloc例程.我们称之为Sclass1.

有一个使用类(让我们称之为Uclass)具有XIB文件和插座.

@property (nonatomic, weak) IBOutlet Sclass1* sclass1;
Run Code Online (Sandbox Code Playgroud)

这与XIB文件布局正确挂钩.

Sclass1是加载Xc for Uclass时分配的属性.Uclass确实被释放,然后不时重新创建,因此我们有另一个Sclass1实例,但Sclass1永远不会消失,无法找到对它的另一个引用.

在仪器中向下钻取显示一个Malloc,就是这样.

fyi,班级开始了

[UIClassSwapper initWithCoder:]
Run Code Online (Sandbox Code Playgroud)

bur*_*rax 5

如果对象未在ARC下取消分配,则表示存在对它的强引用.由于您的属性是weak对象必须由Uclass对象以外的其他东西强烈拥有(否则它将在加载XIB后立即释放).在您提供的代码中,不清楚此对象的实际强大所有者是什么,但我认为它可能是以下一个(或多个):

  1. 由于对象的类是UIView子类,因此可以(强烈)引用它superview作为其中之一subviews.加载XIB文件时会自动发生这种情况.如果superview没有得到解除分配的SClass对象也不会.您可以通过致电删除此所有权removeFromSuperview
  2. 一个强大的所有权周期(保留周期)存在于SClass1对象的ivars之间(即一个强有力的实例变量有一个强烈的引用回到它的所有者 - SClass1).请注意,任何self直接使用的块也会保留强大的参考.强烈引用该块通常会导致保留周期.保存self__weakvar并将其传递给块,除非你有充分的理由不这样做.
  3. 通过例如将对象添加到容器或将指针保存到非__weak变量来存在手动创建的强引用.

尝试查找并删除这些强大的所有权.只有在删除所有这些对象后,才能释放该对象.


Jor*_*tel 0

我认为你@property应该在课堂上表现出色:

@property (nonatomic, strong) IBOutlet Sclass1* sclass1;
Run Code Online (Sandbox Code Playgroud)

因为strong相当于retainARC 会为您管理发布。

您将在 Apple 文档中有关属性属性的部分中获得有关过渡到 ARC 发行说明的更多信息。