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

时间:2013-07-01 15:23:25

标签: ios automatic-ref-counting xib

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

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

@property (nonatomic, weak) IBOutlet Sclass1* sclass1;

这已正确连接到XIB文件布局。

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

在仪器中向下钻取显示一个Malloc,就是它。

fyi,课程开始于

[UIClassSwapper initWithCoder:]

4 个答案:

答案 0 :(得分:5)

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

  1. 由于对象的类是UIView子类,如果superview添加为subviews,它可能会被superview强烈引用。加载XIB文件时会自动发生这种情况。如果SClass未被释放,则removeFromSuperview对象也不会被释放。您可以致电SClass1
  2. 删除此所有权
  3. SClass1对象的ivars之间存在一个强大的所有权周期(保留周期)(即一个强大的实例变量有一个强烈的引用回到它的所有者 - self) 。请注意,直接使用self的任何块都会保留强引用。强烈引用该块通常会导致保留周期。将__weak保存到__weak var并将其传递给块,除非您有充分理由不这样做。
  4. 手动创建的强引用存在于例如将对象添加到容器或将指针保存到非{{1}}变量。
  5. 尝试查找并删除这些强大的所有权。只有在删除所有这些对象后,才能释放该对象。

答案 1 :(得分:1)

由于您的属性很弱并且仍未解除分配,因此请查找对Sclass或其所有者Uclass的强引用。也许你直接在块中使用Uclass(或Sclass),没有__weak typeof(self)weakSelf舞蹈,这个块创建了保留周期。还要注意亲子关系和代表。也许有代表强大而不是弱或两个控制器对彼此有强烈的引用。

此外,如果您想获得更详细的答案,请发布更相关的代码。

答案 2 :(得分:0)

我认为你的@property对于一个班级来说应该很强大:

@property (nonatomic, strong) IBOutlet Sclass1* sclass1;

因为strong相当于retain,ARC将为您管理发布。

您将在属性属性部分中获得有关Transitioning to ARC Release Notes的Apple文档的更多信息。

答案 3 :(得分:0)

我最近有同样的症状 - 为了解决这个问题,我的对象充当了许多其他对象的委托,所以不得不在调用dealloc之前从其所有委托职责中释放对象