有一个有趣的问题,其中有一个类在XIB布局(UIScrollView的子类)中被引用,并且没有根据工具/分配被释放,并且没有在它的dealloc例程中中断。让我们称它为Sclass1。
有一个using类(让我们称它为Uclass),它具有XIB文件和outlet。
@property (nonatomic, weak) IBOutlet Sclass1* sclass1;
这正确地挂接到了XIB文件布局。
Sclass1是加载Uclass的XIB时分配的属性。Sclass1确实会被释放,然后不时地重新创建,因此我们有了另一个Sclass1实例,但Uclas永远不会消失,也找不到对它的另一个引用。
在Instruments中向下钻取显示了一个Malloc,仅此而已。
仅供参考,课程开始时
[UIClassSwapper initWithCoder:]
发布于 2013-10-08 22:52:45
如果一个对象在ARC下没有被释放,这意味着存在对它的强引用。由于您的属性为weak
,因此该对象必须由Uclass对象以外的其他对象拥有(否则,它将在XIB加载后立即被释放)。在您提供的代码中,不清楚这个对象的实际强所有者是什么,但我假设它可能是以下一个(或多个):
UIView
子类,因此如果将其作为subviews
之一添加,则它可能会被其superview
(强)引用。加载XIB文件时,会自动执行此操作。如果superview
没有被释放,SClass
对象也不会被释放。您可以通过调用removeFromSuperview
SClass1
对象的ivars中的某个地方(即,强拥有的实例变量之一具有对其所有者的强引用- SClass1
)。请注意,任何直接使用self
的块也会保留一个强引用。拥有对块的强引用通常会导致保留周期。将self
保存到__weak
变量并将其传递给块,除非您有充分的理由不这样做。__weak
变量的指针等方式,可以手动创建强引用。尝试查找并删除这些强所有权。只有在它们全部被移除之后,对象才能被释放。
发布于 2013-10-11 17:38:22
由于你的属性是弱的,并且它仍然没有被释放,所以寻找对Sclass或它的所有者Uclass的强引用。也许你是直接在块中使用Uclas(或Sclass),而不是使用__weak类型的(自身) weakSelf,并且这个块创建了保留周期。还要注意父子关系和委托关系。也许有一个代表,它是强的而不是弱的,或者两个控制器持有彼此的强引用。
另外,如果你想得到更详细的答案,请发布更多相关的代码。
发布于 2013-10-07 15:55:43
我认为对于一个班级来说,你的@property
应该很强:
@property (nonatomic, strong) IBOutlet Sclass1* sclass1;
因为strong
等同于retain
,ARC将为您管理该版本。
您将在属性属性一节中获得有关Transitioning to ARC Release Notes的苹果文档的更多信息。
https://stackoverflow.com/questions/17408090
复制相似问题