是否需要发布IBOutlet控件? (非ARC)

时间:2014-11-11 00:07:11

标签: ios

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

它们(控件)何时在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 个答案:

答案 0 :(得分:0)

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

  • 任何希望取得实例所有权的类实例都应该调用retain。
  • 要避免使用dangling pointer,应该拥有所有权,除非它会产生retain cycle。在保留周期的情况下,指定为&#39;所有者的实例&#39;应该在解除分配期间拒绝任何关于非所有者的引用。

对于接口构建器,使用元数据文件(Interface Builder生成的XML)中的信息将依赖项注入到控制器/视图中。如果您的媒体资源使用的是强大的&#39;},则应调用[instance release]范围。 (并基于以上两点,他们应该)。

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

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

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

  • 只要正在使用该类,就没有悬空指针。
  • 取消分配类时,将正确释放内存。

令人惊讶的是,ARC可以提供垃圾收集器的90%的好处(唯一的区别是保留周期的特殊处理),但这一切都发生在编译时,这是有效的,因为那里有&如果 是垃圾收集器,那么没有额外的CPU点击或电池消耗。除非您正在研究内存管理(这是一件好事),否则建议使用ARC。在ARC中,它可能主要忘记引用计数,只关注打破任何保留周期。其余部分由编译器处理。