Iphone 在ViewDidDisplay中创建表视图

Iphone 在ViewDidDisplay中创建表视图,iphone,objective-c,ios,Iphone,Objective C,Ios,我正在ViewDidDisplay中创建一个表视图,因为我的应用程序出于多种原因需要在此处创建它。但是,我注意到在分析应用程序时出现内存泄漏 我认为除了init和dealoc之外,在任何其他方法中使用实例变量_tableView都不是一个好主意。如果我只是使用自动释放,我想确保表在适当的时间被释放 “我的表视图”有一个属性 @property (nonatomic, retain) UITableView *tableView; 我创建的表视图如下所示: - (void)viewDidAppe

我正在ViewDidDisplay中创建一个表视图,因为我的应用程序出于多种原因需要在此处创建它。但是,我注意到在分析应用程序时出现内存泄漏

我认为除了init和dealoc之外,在任何其他方法中使用实例变量_tableView都不是一个好主意。如果我只是使用自动释放,我想确保表在适当的时间被释放

“我的表视图”有一个属性

@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)如果你平衡你的分配