是否需要释放一个 IBOutlet 控件? (非弧)

Posted

技术标签:

【中文标题】是否需要释放一个 IBOutlet 控件? (非弧)【英文标题】:Does it need to release a IBOutlet control? (non ARC ) 【发布时间】:2014-11-11 00:07:11 【问题描述】:

我看到其他控件的代码和属性有非属性,保留选项和合成。

它们(控件)何时在 viewcontrol 的生命周期中分配? 我想知道他们是否需要释放。

以下控件(UIView、UIButton、UILabel)需要释放吗?

@interface TreatDuplicationHold : UIViewController <TransactionManagerDelegate, NWPickerFieldDelegate, SearchCompDelegate, SearchCardReaderDelegate> 
    IBOutlet UITableView *_mainTableView;

    IBOutlet UIView *_headerHoldView;
    IBOutlet UIView *_tranHoldDateView;
    IBOutlet UIView *_searchHoldView;
    IBOutlet UIView *_detailHoldView;
    IBOutlet UIView *_resultHoldView;
    IBOutlet UIView *_dateSelectView;
    IBOutlet UIDatePicker *_datePicker;
    IBOutlet UIButton *_btnAddData;

    IBOutlet UILabel *_lblSelectAll;
    IBOutlet UILabel *_lblSelectScreen;
    IBOutlet UIButton *_btnSelectAll;
    IBOutlet UIButton *_btnSelectScreen;
    IBOutlet UIButton *_btnRequestHoldFree;

    IBOutlet NWPickerField *_bpCompPicker;

这是实现。

- (void)dealloc 
    [_arrHidData release];

    [TRANS release];
    [_arrItemList release];
    [_arrHidData release];
    [_arrCheckBoxValue release];

    [_startDate release];
    [_endDate release];

    // Here release IBOutlet control. 
    [_tranHoldDateView release];
    [_searchHoldView release];
    [_detailHoldView release];
    [_resultHoldView release];
    [_headerHoldView release];
    [_mainTableView release];
    [_dateSelectView release];
    [_datePicker release];
    [_bpCompPicker release];
    [_btnAddData release];
    [_btn_CallAgency release];
    [_btn_CallBCCard release];

    [_imvSelectAll release];
    [_imvSelectScreen release];
    [_lblSelectAll release];
    [_lblSelectScreen release];
    [_btnSelectAll release];
    [_btnSelectScreen release];
    [_btnRequestHoldFree release];

    [super dealloc];

【问题讨论】:

【参考方案1】:

应用正常的 Cocoa 内存管理规则。

希望获得实例所有权的类的任何实例都应调用retain。 为避免dangling pointer,除非会导致retain cycle,否则应取得所有权。在保留周期的情况下,指定为“所有者”的实例应在解除分配期间消除对非所有者的任何引用。

在界面构建器的情况下,使用元数据文件(界面构建器生成的 XML)中的信息将依赖项注入您的控制器/视图。如果您的属性使用“强”范围,则应调用 [instance release]。 (并且基于以上两点,他们应该是)。

在上面的代码中,您使用了 ivars 而不是属性。我不确定这是否会在手动内存管理下正常工作。但是,如果您使用属性而不是 ivars,那肯定是正确的。示例:

@property (nonatomic, strong) IBOutlet UIView *headerHoldView;

。 .如果你这样做,自动合成的 setter 将在调用该 setter 时取得所有权。 (它还将释放非零先前值的所有权)。因此,这将确保:

只要类被使用,就没有悬空指针。 当类被释放时,内存将被正确释放。

ARC 可以提供垃圾收集器的 90% 的好处(唯一的区别是对保留周期的特殊处理),这真是太神奇了,但这一切都发生在编译时,这是高效的,因为没有额外的 CPU 点击如果有 垃圾收集器,则可能会消耗电池电量。除非您正在学习内存管理(这是一件好事),否则建议使用 ARC。在 ARC 中,大多数情况下可能会忘记引用计数,而只专注于打破任何保留周期。其余的由编译器处理。

【讨论】:

使用ARC这么久,写这个答案并不容易。 谢谢 Jasper,我的伙伴还没有学会 ARC 的使用。 :D

以上是关于是否需要释放一个 IBOutlet 控件? (非弧)的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不声明 IBOutlet 属性的情况下访问 IB 对象(例如 UILabel)?

stringByAppendingString 和保留困境

Qt窗口及控件-窗口Close()自动释放

无法在 Interface Builder 中连接 IBOutlet

关于输出口和操作方法,以及sender

单个对象,多个 IBOutlets