【问题标题】:Objective C Interface Builder ARC - retain custom ControllerObjective C Interface Builder ARC - 保留自定义控制器
【发布时间】:2012-07-21 05:01:18
【问题描述】:

在 iPhone 应用程序中,我有一个带有按钮的视图。 Button 连接到 MyClass 的 IBAction

@interface MyClass : NSObject   
-(IBAction)buttonPressed:(id)sender;
@end

只要我点击这个按钮,我就会得到一个 EXC_BAD_ACCESS。类MyClass 已通过使用右侧边栏中的“对象”组件添加到视图中。

我认为这是因为我的自定义控制器被 ARC 释放。它是否正确?通过接口控制器添加的对象不会自动保留吗?如何保留我通过接口生成器连接的实例?

【问题讨论】:

    标签: objective-c ios xcode xcode4


    【解决方案1】:
    1. MyClass 必须是UIView 的子类,而不是NSObject

    2. 如果您认为对象被过早释放,请实现-dealloc 方法并添加一些日志记录和断点。

    3. 如果您的自定义视图在屏幕上,则其超级视图将持有对该视图的引用,并且不会被释放。如果您的自定义视图控制器有一个父视图控制器,例如 UINavigationController,那么它的父视图控制器将持有对您的视图控制器的引用,并且不会被释放。

    4. -buttonPressed: 方法中设置断点以确认它被正确调用。然后单步执行代码。

    5. 查看 EXC_BAD_ACCESS 时的调用堆栈,以更好地找出问题所在。你的 -buttonPressed: 方法实际上被调用了吗?

    【讨论】:

      【解决方案2】:

      好的,第一件事。为什么要将 IBAction 添加到您的课程中?因为控制器应该有处理事件的出口。这是什么课程?

      你必须在你的控制器中实例化它(不知道你是如何连接它的)并保留它以使其生效,因为它可能会变为 nil,因为没有任何东西持有它。

      这只是一个不好的做法,你的动作的逻辑应该由控制器自己处理,这是控制器的功能,所以最好把动作挂在控制器中。

      【讨论】:

      • MyClass 类应该充当“自定义控制器”——已经存在的视图控制器的附加控制器。将来MyClass 将在执行 IBAction 时检索数据,并将通过 IBOutlet 将这些数据呈现在表中。
      • 应该,但你没有扩展控制器,所以它没有做任何视图处理,我仍然不明白你是如何连接所有东西的,你使用界面生成器吗?在你的控制器里面有一个“自定义控制器”的目的是什么?你不需要这个类来实现你所需要的。
      • 我创建了一个obj-c类MyClass,添加了IBAction,添加了一个“Object”组件(黄色球体作为图标的东西),并将身份检查器中的类更改为@ 987654324@。好的?这样做的原因是将与数据库相关的 IBAction 与所有其他 IBAction 分开。
      • 您严重违背了应该使用的 MVC 架构。您没有真正的模型,它应该进行数据库调用,而不是控制器本身。你说你添加了 IBAction 但你把它连接到按钮了吗?在 IB 中还是在代码中?向什么添加了“对象”组件?
      • 如果你仍然想走这条路,你必须在你的视图控制器中创建一个属性来保存你的 MyClass 对象,你真正要做的就是在你的应用程序中添加另一个不必要的层。
      猜你喜欢
      • 1970-01-01
      • 2011-11-09
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      相关资源
      最近更新 更多