Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IOS 6.1与来自XIB的ARC类无法解除分配,UIClassSwapper_Ios_Automatic Ref Counting_Xib - Fatal编程技术网

IOS 6.1与来自XIB的ARC类无法解除分配,UIClassSwapper

IOS 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确实会被释放,然后不时地重新创建,因

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

有一个using类(我们称之为Uclass)包含XIB文件和outlet

@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有一个指向控制器的引用。创建一个保留周期。投票表决吧。谢谢你指出了阻塞导致的保留周期。在我看来,这的确是一个常见的情况。我的回答中也加入了这一点。