这是我早就应该解决的问题,但我只需要知道在以下情况下解除分配的最佳做法。
在我的头文件中,我声明了对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
并在viewDidUnLoad
和dealloc
方法中执行此操作时,我是否正确?
答案 0 :(得分:2)
self.loginBtn = nil;
中不需要dealloc
,前一行发布了它。最好不要使用该属性在dealloc中释放它。释放vs将属性设置为nil的原因是setter是一个方法调用,而类正处于拆除状态,事情可能不稳定。
在viewDidUnLoad
版本中发布IBOutlet
个self.theOutlet = nil;
的{{1}}属性,在这种情况下,_loginBtn release];
不需要且冗余。同时释放您可以轻松重新创建的任何其他对象。
如果使用了属性,则它们应该用于类中的所有访问,但有两个例外:init和dealloc。在这两种情况下,该课程都是部分完成的。在这两种情况下,最好直接在init
(如有必要)和release
dealloc
中使用ivar。
答案 1 :(得分:1)
不,这是不正确的。首先释放_loginBtn然后将属性设置为nil,然后释放实例两次。正确的方法是释放_loginBtn,然后将_loginBtn设置为nil。