我很难理解UIViewController中的一些方法,但首先我会说一下我认为它们的用途(忽略界面构建器,因为我不使用它):
- init:初始化非视图相关的东西,在低内存情况下不需要释放(即不是对象或难以重新创建的对象)。 - loadView:创建视图并设置[self view]属性。 - viewDidLoad:创建所有其他视图元素。 - viewDidUnload:释放在-viewDidLoad中创建的对象。 - didReceiveMemoryWarning:低内存情况下,释放不必要的东西,如缓存数据,如果此视图没有superview,则[super didReceiveMemoryWarning]将继续释放(卸载)视图并调用-viewDidUnload。 - dealloc:释放所有内容。 - viewWillAppear:, viewDidAppear:, viewWillDisappear:, viewDidDisappear:自我说明,除非您想对这些事件做出响应(执行某些操作),否则不必要。
我有几件事不确定。首先,苹果文档说当-viewDidUnload被调用时,视图已经被释放并设置为nil。
- loadView是否会在以后重新创建视图? - 我在-viewDidLoad中创建了一些东西,因为没有必要并且它将被视图保留(因为它们是其子视图)。所以当视图被释放时,它也会释放它们,对吗?当视图被释放时,它会释放所有子视图吗?因为我在-viewDidLoad中创建的所有对象都是[self view]的子视图。所以如果它们已经被释放,为什么要在-viewDidUnload中再次释放它们呢?我可以理解在这些方法中加载和卸载可见时必要的数据,但正如我所问的,如果它们已经被释放,为什么要释放子视图呢?
编辑:阅读其他问题后,我认为我可能明白了(我的第二个问题)。在我只使用本地变量的情况下,分配它,将其设置为子视图并释放它,它将具有1的保留计数(从添加为子视图),因此当视图被释放时,它也会被释放。现在对于具有指向它们的ivars的视图元素,我没有使用属性,因为没有外部类需要访问它们。但现在我认为这是错误的,因为在这种情况下:
在这种情况下,由于ivar没有对其进行保留(因为它不是一个属性),因此在释放之后,标签将收到“-release”消息。但是,使用属性时保留计数将为两个:视图保留和属性保留。因此,在“-viewDidUnload”中它将被释放。所以最好总是使用属性处理这些事情,我说的对吗?还是不对?
- init:初始化非视图相关的东西,在低内存情况下不需要释放(即不是对象或难以重新创建的对象)。 - loadView:创建视图并设置[self view]属性。 - viewDidLoad:创建所有其他视图元素。 - viewDidUnload:释放在-viewDidLoad中创建的对象。 - didReceiveMemoryWarning:低内存情况下,释放不必要的东西,如缓存数据,如果此视图没有superview,则[super didReceiveMemoryWarning]将继续释放(卸载)视图并调用-viewDidUnload。 - dealloc:释放所有内容。 - viewWillAppear:, viewDidAppear:, viewWillDisappear:, viewDidDisappear:自我说明,除非您想对这些事件做出响应(执行某些操作),否则不必要。
我有几件事不确定。首先,苹果文档说当-viewDidUnload被调用时,视图已经被释放并设置为nil。
- loadView是否会在以后重新创建视图? - 我在-viewDidLoad中创建了一些东西,因为没有必要并且它将被视图保留(因为它们是其子视图)。所以当视图被释放时,它也会释放它们,对吗?当视图被释放时,它会释放所有子视图吗?因为我在-viewDidLoad中创建的所有对象都是[self view]的子视图。所以如果它们已经被释放,为什么要在-viewDidUnload中再次释放它们呢?我可以理解在这些方法中加载和卸载可见时必要的数据,但正如我所问的,如果它们已经被释放,为什么要释放子视图呢?
编辑:阅读其他问题后,我认为我可能明白了(我的第二个问题)。在我只使用本地变量的情况下,分配它,将其设置为子视图并释放它,它将具有1的保留计数(从添加为子视图),因此当视图被释放时,它也会被释放。现在对于具有指向它们的ivars的视图元素,我没有使用属性,因为没有外部类需要访问它们。但现在我认为这是错误的,因为在这种情况下:
// MyViewController.h
@interface MyViewController : UIViewController {
UILabel *myLabel;
}
// MyViewController.m
. . .
- (void)viewDidLoad {
myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 40, 10)];
[myLabel setText:@"Foobar"];
[[self view] addSubview:myLabel];
}
- (void)viewDidUnload [
// equivalent of [self setMyLabel:nil]; without properties
[myLabel release];
myLabel = nil;
}
在这种情况下,由于ivar没有对其进行保留(因为它不是一个属性),因此在释放之后,标签将收到“-release”消息。但是,使用属性时保留计数将为两个:视图保留和属性保留。因此,在“-viewDidUnload”中它将被释放。所以最好总是使用属性处理这些事情,我说的对吗?还是不对?
-viewDidLoad
中重新加载数据之外,-viewDidUnload
还用于释放仍然保留[self view]
的子视图的属性([self setProperty:nil]
),而[self view]
已经释放,以便它们可以被销毁。我的理解正确吗? - mk12