IOS 6.1与来自XIB的ARC类无法解除分配,UIClassSwapper
有一个有趣的问题,其中有一个类在XIB布局(UIScrollView的子类)中被引用,并且没有根据工具/分配取消分配,也没有中断它的dealloc例程。让我们称之为Sclass1 有一个using类(我们称之为Uclass)包含XIB文件和outletIOS 6.1与来自XIB的ARC类无法解除分配,UIClassSwapper,ios,automatic-ref-counting,xib,Ios,Automatic Ref Counting,Xib,有一个有趣的问题,其中有一个类在XIB布局(UIScrollView的子类)中被引用,并且没有根据工具/分配取消分配,也没有中断它的dealloc例程。让我们称之为Sclass1 有一个using类(我们称之为Uclass)包含XIB文件和outlet @property (nonatomic, weak) IBOutlet Sclass1* sclass1; 这已正确连接到XIB文件布局 Sclass1是在加载Uclass的XIB时分配的属性。Uclass确实会被释放,然后不时地重新创建,因
@property (nonatomic, weak) IBOutlet Sclass1* sclass1;
这已正确连接到XIB文件布局
Sclass1是在加载Uclass的XIB时分配的属性。Uclass确实会被释放,然后不时地重新创建,因此我们有另一个Sclass1实例,但Sclass1从未消失,也找不到对它的其他引用
在仪器中向下钻取显示一个Malloc,就是它
仅供参考,本课程将从
[UIClassSwapper initWithCoder:]
我认为你的
@属性
对于一个类来说应该是强大的:
@property (nonatomic, strong) IBOutlet Sclass1* sclass1;
因为strong
相当于retain
,ARC将为您管理发布
您将在有关属性属性的部分中获得有关Apple文档的更多信息。如果对象未在ARC下解除分配,则表示存在对该对象的强引用。由于您的属性是
弱的
,因此该对象必须由Uclass对象以外的其他对象强拥有(否则它将在加载XIB后立即被解除分配)。在您提供的代码中,不清楚此对象的实际强所有者是什么,但我假设它可能是以下一个(或多个):
UIView
子类,如果将其添加为子视图之一,则它可能(强烈)被其superview
引用。加载XIB文件时会自动发生这种情况。如果superview
未解除分配,SClass
对象也不会解除分配。您可以通过调用removeFromSuperview
SClass1
对象的IVAR之间的某个地方存在一个强所有权周期(保留周期)(即,一个强所有权实例变量对其所有者有一个强引用,即SClass1
)。请注意,任何直接使用self
的块也会保留强引用。有一个强大的参考块,然后往往导致一个保留周期。将self
保存到\uu-weak
var,并将其传递到块,除非您有充分的理由不这样做\u弱
变量的指针尝试寻找并移除这些强大的所有权。只有在删除所有属性后,才能解除分配对象。由于您的属性很弱,而且尚未解除分配,请查找对Sclass或其所有者Uclass的强引用。也许你是在块中直接使用Uclass(或Sclass),没有弱类型的(自我)弱自我舞蹈,这个块创建了一个循环。还要注意亲子关系和代表。可能有一个委托是强的,而不是弱的,或者两个控制器彼此持有强引用
另外,如果您想获得更详细的答案,请发布更多相关的代码。我最近也有同样的症状-在我的情况下,为了解决这个问题,我的对象充当了许多其他对象的代理,因此必须在调用dealloc之前解除该对象的所有代理职责。这是正确的答案,IBOutlet的任何内容都必须是弱的,视图不会被释放,因为控制器有一个指向该outlet的保留点,并且该outlet有一个指向控制器的引用。创建一个保留周期。投票表决吧。谢谢你指出了阻塞导致的保留周期。在我看来,这的确是一个常见的情况。我的回答中也加入了这一点。