有一个有趣的问题,其中有一个类在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:]
答案 0 :(得分:5)
如果某个对象未在ARC下取消分配,则表示存在对它的强引用。由于您的属性为weak
,因此该对象必须由Uclass对象以外的其他东西强烈拥有(否则它将在加载XIB后立即释放)。在您提供的代码中,不清楚此对象的实际强拥有者是什么,但我认为它可能是以下一个(或多个):
UIView
子类,如果superview
添加为subviews
,它可能会被superview
强烈引用。加载XIB文件时会自动发生这种情况。如果SClass
未被释放,则removeFromSuperview
对象也不会被释放。您可以致电SClass1
SClass1
对象的ivars之间存在一个强大的所有权周期(保留周期)(即一个强大的实例变量有一个强烈的引用回到它的所有者 - self
) 。请注意,直接使用self
的任何块都会保留强引用。强烈引用该块通常会导致保留周期。将__weak
保存到__weak
var并将其传递给块,除非您有充分理由不这样做。尝试查找并删除这些强大的所有权。只有在删除所有这些对象后,才能释放该对象。
答案 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之前从其所有委托职责中释放对象