开发者

release view in viewDidUnload

开发者 https://www.devze.com 2023-03-09 18:00 出处:网络
I know that if I retain an IBOutlet by using property then I have to set it to nil in viewDidUnload but what about others?

I know that if I retain an IBOutlet by using property then I have to set it to nil in viewDidUnload but what about others?

For example, i have three subviews view1, view2 and view3, that load from nib and that is the controller's header file

@interface MyViewController : UIViewController {
    IBOutlet UIView *view1;
    UIView *view2;
    //no reference for view3
}
@property (nonatomic, retain) IBOutlet UIView *view2;  //property view2 is an IBOutlet!!
@end

and method viewDidUnload

- (void)viewDidUnload {
    self.view2 = nil;
    //[view1 release];
    //view1 = nil;
    [super viewDidUnload];
}

do I have to release view1 and set it to nil? or UIViewController will set it to nil for me? what about view3?

开发者_C百科

also do I have to release view1 in dealloc?

edit: I think many people does not understand my question

Firstly, view1 is an IBOutlet which declared as an ivar and assign an ivar will not retain it. I know that UIViewController definitely will retain it but do i have to release it or UIViewController will release it for me? If UIViewController will release it then there is no point that i have to release it again.

Secondly, view2 is also an IBOutlet although it is declared as a property not ivar.

@property (nonatomic, retain) IBOutlet UIView *view2;

It is a retain property, therefore set it will retain it so I know that I have to set it to nil in order to release it. I have no problem about it.

For view3, there is no reference for it, therefore I am assuming I don't have to do anything about it. I also assuming there is no need to make a reference for every object in nib.


All outlets are retained by default even if they don't have a property declared for them. So you will need to release them. If you go on to declare an assigned property as an outlet, then you don't need to release but you can't rely on it either as you are not an owner.

So you need to release both view1 and view2 as they are declared as outlets. view3 is a variable that doesn't exist and hence needn't be worried about.


When a nib is loaded, all its objects are automatically instantiated and retained. The file's owner of your nib file is then the owner of your UIView.

If you use UIView *view2 you can't connect them using interface builder. So that doesn't make really sense to me.

You have to release in dealloc as well.

- (void)viewDidUnload {
  self.view1 = nil;
  self.view2 = nil;
  [super viewDidUnload];
}

- (void)dealloc {
  [self.view1 release];
  self.view1 = nil;
  [self.view2 release];
  self.view2 = nil;
}
0

精彩评论

暂无评论...
验证码 换一张
取 消