取消分配IBOutlets和实例变量

时间:2011-10-05 02:47:35

标签: objective-c cocoa-touch memory-management properties iboutlet

这是我早就应该解决的问题,但我只需要知道在以下情况下解除分配的最佳做法。

在我的头文件中,我声明了对IBOutlet的引用,如下所示:

@interface Test : UIViewController {
    UIButton *_loginBtn;
}

@property (nonatomic, retain) IBOutlet UIButton *loginBtn;

在实现文件中,我将实例变量与属性相关联,并按如下方式解除分配:

@implementation Test

@synthesize loginBtn = _loginBtn;

...

- (void) dealloc {
    [_loginBtn release];
    self.loginBtn = nil;

    [super dealloc];
}

- (void) viewDidUnLoad {
    [_loginBtn release];
    self.loginBtn = nil;

    [super viewDidUnLoad];
}

在解除分配实例变量并将属性设置为nil并在viewDidUnLoaddealloc方法中执行此操作时,我是否正确?

2 个答案:

答案 0 :(得分:2)

self.loginBtn = nil;中不需要dealloc,前一行发布了它。最好不要使用该属性在dealloc中释放它。释放vs将属性设置为nil的原因是setter是一个方法调用,而类正处于拆除状态,事情可能不稳定。

viewDidUnLoad版本中发布IBOutletself.theOutlet = nil;的{​​{1}}属性,在这种情况下,_loginBtn release];不需要且冗余。同时释放您可以轻松重新创建的任何其他对象。

如果使用了属性,则它们应该用于类中的所有访问,但有两个例外:init和dealloc。在这两种情况下,该课程都是部分完成的。在这两种情况下,最好直接在init(如有必要)和release dealloc中使用ivar。

答案 1 :(得分:1)

不,这是不正确的。首先释放_loginBtn然后将属性设置为nil,然后释放实例两次。正确的方法是释放_loginBtn,然后将_loginBtn设置为nil。