【问题标题】:Dealloc of UIView subclass prevents running class methodsUIView 子类的 Dealloc 阻止运行类方法
【发布时间】:2013-06-28 12:01:46
【问题描述】:

我创建了一个 UIView 子类,里面有一个 UIButton,里面有一个点击目标。 选择器在 UIView 子类中实现,并由 Interface Builder 链接。

但是当我在父视图控制器中运行 addSubview 时,点击按钮会导致

performSelector:withObject:withObject:]:消息发送到deallocated 实例

(我使用 ARC) 我在 dealloc 方法中添加了一些控制台输出,我看到在 viewDidLoad 以 UIView 子类的 addSubview 结束后,子类被释放了。

如何防止这种情况发生? 我尝试了@property(非原子,保留),将实例添加到一些全局数组...... 但没有运气。

我了解 ARC 会释放该对象,因为没有留下强引用,但我无法强制阻止这种情况。

任何帮助将不胜感激。

【问题讨论】:

    标签: ios uiview xcode4.2 dealloc


    【解决方案1】:

    在 View Controller 类中创建子视图类的强引用可能会帮助您解决问题。

    @property (strong , nonatomic) UIView *subclassName;
    

    【讨论】:

    • 如何创建 UIButton 的引用?另外,您是否在某处创建了 ViewController 对象的引用?如果是,那么您是如何创建它的?
    • 起初我只是在视图中创建了一个按钮,然后我创建了一个 IBAction touchUpInside(用一些鼠标拖动)现在我还使用 @property(nonatomic, strong) 创建了一个插座,但它没有改变这种情况。
    • 创建新项目时默认使用 ViewController 引用:@property (strong, nonatomic) ViewController *viewController;
    • 你的 UIView 子类有与之关联的 nib 吗?如果没有,那么您不需要 IBOutlet,只需创建一个属性就可以了。那么我可以看看你的代码吗?到时候我可能会有所帮助。
    • 当然是和笔尖关联的。我告诉过你,按钮和动作是通过 Interface Builder 创建的。
    【解决方案2】:

    您是否正在存储您尝试添加为子视图的按钮 (UIButton) 的引用?

    【讨论】:

    • Button 是通过 Interface Builder 添加的,并带有 Touch Up Inside 上的链接操作,所以我猜该引用已存储并且应该可以工作。但事实并非如此,所以我在这里遗漏了一些东西
    • 可能你不需要继承 UIButton,为什么不使用 Category
    • 但我没有继承 UIButton。我正在继承 UIView。但是它里面的所有带有目标的对象都不能运行,因为 UIView 子类实例在 addSubview 之后被释放。我之前使用工作方法创建了自定义 UIView,但现在我无法重复此操作,也找不到使它在以前的项目中工作的线索
    【解决方案3】:

    问题在于将 NIB 链接到 Class。

    我将文件所有者链接到类而不是链接 UIView 对象。

    通常在使用 UIViewController 处理 nib 时,需要将 File Owner 链接到 UIViewController 类。 但是在处理 UIView 子类时,必须链接 UIView 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-19
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多