【问题标题】:ARC and local variablesARC 和局部变量
【发布时间】:2011-07-22 17:52:04
【问题描述】:

我目前正忙于将我的代码转换为 ARC,并且在使用局部变量时遇到了一些麻烦。因为它们只在编译器认为我需要它们时才保存在内存中,它们通常在最后一次调用它们的方法后被释放。

不幸的是,我的应用程序包含一个带有自定义内容的 HUD,例如 UIButtons。那些选择器指向 HUD 本身,所以我总是得到一个 EXC_BAD_ACCESS,因为控制器在实例化后被释放。

除了在我的类头中创建一个实例变量之外,还有什么解决办法吗?

【问题讨论】:

    标签: iphone objective-c automatic-ref-counting


    【解决方案1】:

    虽然这与将 iVar 放在标题中实际上是一回事,但您至少可以通过在 .m 文件顶部创建一个私有类别来保持内容更简洁,该类别定义您可以保存 UIButtons 的属性。

    @interface MyClass ()
    @property (nonatomic, retain) UIButton *myButton;
    @end
    
    @implementation MyClass
    @synthesize myButton;
    
    ....
    
    self.myButton = thingThatisHoldingYourButton;
    
    // Now for the block
    

    【讨论】:

    • 我不太确定我是否了解您所处的确切情况,但必须保留对控制器的引用...如果您真的觉得有必要,您也可以使用编译器指令说你自己维护记忆并保留它。但是谁会发布呢?
    • 但是我的方法调用不是一直对addSubview 控制器进行吗?我的意思是,当我们必须手动进行内存管理时,它确实如此,那它为什么停止工作呢?
    • 它保留视图,但不保留控制器。控制器必须单独维护。具有主控制器的视图控制器也很想知道有一个子控制器。我认为它以前有效,因为您有一个保留在内存中的错误,ARC 现在已经清除了该错误。
    • 所以除了宣布一个出口没有其他机会,不是吗? __block 之类的呢?
    • 就像我说的,我对你的情况感到困惑。只是在块中使用控制器应该保留它,但听起来你需要在块完成执行后让控制器生效(因为有一个回调到你的控制器)。如果是这种情况,您需要在某处保留引用,而不是在块中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多