首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >来自XIB的带有ARC类的IOS 6.1未被释放,UIClassSwapper

来自XIB的带有ARC类的IOS 6.1未被释放,UIClassSwapper
EN

Stack Overflow用户
提问于 2013-07-01 23:23:25
回答 4查看 1.7K关注 0票数 8

有一个有趣的问题,其中有一个类在XIB布局(UIScrollView的子类)中被引用,并且没有根据工具/分配被释放,并且没有在它的dealloc例程中中断。让我们称它为Sclass1。

有一个using类(让我们称它为Uclass),它具有XIB文件和outlet。

代码语言:javascript
运行
复制
@property (nonatomic, weak) IBOutlet Sclass1* sclass1;

这正确地挂接到了XIB文件布局。

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

在Instruments中向下钻取显示了一个Malloc,仅此而已。

仅供参考,课程开始时

代码语言:javascript
运行
复制
[UIClassSwapper initWithCoder:]
EN

回答 4

Stack Overflow用户

发布于 2013-10-08 22:52:45

如果一个对象在ARC下没有被释放,这意味着存在对它的强引用。由于您的属性为weak,因此该对象必须由Uclass对象以外的其他对象拥有(否则,它将在XIB加载后立即被释放)。在您提供的代码中,不清楚这个对象的实际强所有者是什么,但我假设它可能是以下一个(或多个):

  1. 由于对象的类是UIView子类,因此如果将其作为subviews之一添加,则它可能会被其superview (强)引用。加载XIB文件时,会自动执行此操作。如果superview没有被释放,SClass对象也不会被释放。您可以通过调用removeFromSuperview
  2. A强所有权循环(Retain cycle )来移除此所有权。强所有权循环(Retain Cycle)存在于SClass1对象的ivars中的某个地方(即,强拥有的实例变量之一具有对其所有者的强引用- SClass1)。请注意,任何直接使用self的块也会保留一个强引用。拥有对块的强引用通常会导致保留周期。将self保存到__weak变量并将其传递给块,除非您有充分的理由不这样做。
  3. 通过将对象添加到容器或保存指向非__weak变量的指针等方式,可以手动创建强引用。

尝试查找并删除这些强所有权。只有在它们全部被移除之后,对象才能被释放。

票数 5
EN

Stack Overflow用户

发布于 2013-10-11 17:38:22

由于你的属性是弱的,并且它仍然没有被释放,所以寻找对Sclass或它的所有者Uclass的强引用。也许你是直接在块中使用Uclas(或Sclass),而不是使用__weak类型的(自身) weakSelf,并且这个块创建了保留周期。还要注意父子关系和委托关系。也许有一个代表,它是强的而不是弱的,或者两个控制器持有彼此的强引用。

另外,如果你想得到更详细的答案,请发布更多相关的代码。

票数 1
EN

Stack Overflow用户

发布于 2013-10-07 15:55:43

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

代码语言:javascript
运行
复制
@property (nonatomic, strong) IBOutlet Sclass1* sclass1;

因为strong等同于retain,ARC将为您管理该版本。

您将在属性属性一节中获得有关Transitioning to ARC Release Notes的苹果文档的更多信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17408090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档