Iphone 在ViewDidDisplay中创建表视图
我正在ViewDidDisplay中创建一个表视图,因为我的应用程序出于多种原因需要在此处创建它。但是,我注意到在分析应用程序时出现内存泄漏 我认为除了init和dealoc之外,在任何其他方法中使用实例变量_tableView都不是一个好主意。如果我只是使用自动释放,我想确保表在适当的时间被释放 “我的表视图”有一个属性Iphone 在ViewDidDisplay中创建表视图,iphone,objective-c,ios,Iphone,Objective C,Ios,我正在ViewDidDisplay中创建一个表视图,因为我的应用程序出于多种原因需要在此处创建它。但是,我注意到在分析应用程序时出现内存泄漏 我认为除了init和dealoc之外,在任何其他方法中使用实例变量_tableView都不是一个好主意。如果我只是使用自动释放,我想确保表在适当的时间被释放 “我的表视图”有一个属性 @property (nonatomic, retain) UITableView *tableView; 我创建的表视图如下所示: - (void)viewDidAppe
@property (nonatomic, retain) UITableView *tableView;
我创建的表视图如下所示:
- (void)viewDidAppear:(BOOL)animated
{
self.tableView = [[UITableView alloc]
initWithFrame:CGRectMake(0, 0, 320, 300)
style:UITableViewStyleGrouped];
// Table View properties
self.tableView.dataSource = self;
self.tableView.delegate = self;
[self.view addSubview:self.tableView];
}
- (void)viewDidDisappear:(BOOL)animated
{
self.tableView = nil;
}
- (void)dealloc
{
[_tableView release];
}
自动释放。您可以为alloc获得一个retain,为property assignment获得另一个retain(假设它是保留的属性)
您的dealloc应该处理其中一个和另一个自动释放。自动释放。您可以为alloc获得一个retain,为property assignment获得另一个retain(假设它是保留的属性)
您的dealloc应该处理其中一个,并自动释放另一个。设置属性很好,当您想在另一个类中使用实例变量时,我为该变量设置了属性,否则就没有必要了 由于您是在ViewDidDisplay中创建的,因此它将始终在该控制器的视图出现时创建,因此最好在ViewDidDiscovery方法中重新关联tableview
如果您使用autorelease,我们将无法获得它的发布时间,因此有时访问tableview会导致应用程序崩溃,设置属性很好,当您想在另一个类中使用该变量时,我为该实例变量设置了属性,否则就没有必要了 由于您是在ViewDidDisplay中创建的,因此它将始终在该控制器的视图出现时创建,因此最好在ViewDidDiscovery方法中重新关联tableview
如果您使用autorelease,我们将无法在它发布时获得它,因此有时访问tableview会导致应用程序崩溃,除了其他人所说的之外,我建议您不要在
视图中执行alloc
,因为该方法可以根据其他情况多次调用(顺便说一句,除非您在分配另一个tableView之前开始检查tableView是否存在,否则会导致泄漏)。在viewDidLoad
中执行此操作似乎更安全
另一方面,我认为你的视图确实出现了
,视图确实消失了
和解除锁定
也应该调用它们的超级版本。除了其他人所说的,我不鼓励你在视图确实出现了
中执行alloc
,因为这种方法可以调用多次时间取决于其他情况(顺便说一句,除非您在分配另一个tableView之前开始检查tableView是否存在,否则会导致泄漏)。在viewDidLoad
中执行此操作似乎更安全
另一方面,我认为您的视图确实出现了
,视图确实消失了
和解除锁定
也应该调用它们的超级
版本。self.tableView
是一个保留
属性,因此您的合成setter会增加保留计数。但是当您创建一个新的UITableView时
使用alloc
/init
,您还可以增加保留计数。因此此行会导致tableView
被保留两次:
self.tableView = [[UITableView alloc]
initWithFrame:CGRectMake(0, 0, 320, 300)
style:UITableViewStyleGrouped];
使用alloc
/init
时一次,使用self.tableView=
调用合成setter时一次
您没有两个相应的release
调用
正确的处理方法是autorelease
将alloc
/init
'd UITableView对象设置为self.tableView
,如下所示:
self.tableView = [[[UITableView alloc]
initWithFrame:CGRectMake(0, 0, 320, 300)
style:UITableViewStyleGrouped]
autorelease];
代码的其余部分将按预期工作
另外,您可能不想在viewdide
中创建您的UITableView
。此时您的视图已经出现(因此而得名),并且您可能希望在这之前使用UITableView
。您也可能不希望每次视图出现时都创建一个新的UITableView
的CPU开销。您可能希望在viewDidLoad
中创建一个UITableView
,然后重新使用它,除非有很好的理由不这样做。self.tableView
是一个retain
属性,因此您的合成setter会增加保留计数。但是当您使用alloc
/init
创建新的UITableView
时,您也会增加保留计数。因此此行会导致tableView
被保留两次:
self.tableView = [[UITableView alloc]
initWithFrame:CGRectMake(0, 0, 320, 300)
style:UITableViewStyleGrouped];
使用alloc
/init
时一次,使用self.tableView=
调用合成setter时一次
您没有两个相应的release
调用
正确的处理方法是autorelease
将alloc
/init
'd UITableView对象设置为self.tableView
,如下所示:
self.tableView = [[[UITableView alloc]
initWithFrame:CGRectMake(0, 0, 320, 300)
style:UITableViewStyleGrouped]
autorelease];
代码的其余部分将按预期工作
另外,您可能不想在viewdide
中创建您的UITableView
。此时您的视图已经出现(因此而得名),并且您可能希望在这之前使用UITableView
。您也可能不希望每次视图出现时都创建一个新的UITableView
的CPU开销。您可能希望在viewDidLoad
中创建一个UITableView
,然后重新使用它,除非有很好的理由不这样做。我没有复制在[super…]中,但他们都在调用它。视图层次结构已完成,因此viewDidLoad不总是被调用,这就是我尝试使用ViewDidDisplay的原因。如果我在viewDidDisapear中释放,在调用ViewDidAspear之前是否需要If(self.tableView==nil)?在调用ViewDidAspect之前是否总是为nil?(1)如果你平衡你的分配