是否需要释放一个 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)?