2011-10-06 104 views
0

请参阅以下代码我想知道我该如何解除分配单元格。根据我的理解,每个保留的每个分配和释放必须有一个解除分配。下面如何在目标C中释放和释放这些变量?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"UITableViewCell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] 
       initWithStyle: UITableViewCellStyleSubtitle 
       reuseIdentifier: CellIdentifier] autorelease]; 
    } 
    cell.textLabel.text = [dataArray objectAtIndex:indexPath.row]; return cell; 
} 

,并从代码我在做正确的事情去页头dataArray的或者它应该被释放或两者。
接口

@interface myViewController : UIViewController 
{ 
    NSArray *dataArray; 
} 

@property(retain,nonatomic) NSArray *dataArray; 
@end 

从实施

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.dataArray=[[NSArray alloc] initWithObjects:@"XXX",@"YYY",@"ZZZ",nil]; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    [self.dataArray dealloc]; 
} 

回答

2

在你的榜样,你分配的细胞会被自动释放,因为你已经发送对象的自动释放消息。所以你不必担心它的内存被释放 - 这将自动发生。

至于你的第二个问题,一般来说,你不应该直接调用dealloc。当对象的保留计数变为零时,系统会为您调用dealloc。你应该阅读下面的文章,它以很清晰的方式解释了内存管理:http://interfacelab.com/objective-c-memory-management-for-lazy-people/

您发布的特定代码有两个问题。首先,根据我上面所说的,dealloc应该被释放的调用所取代。其次,实际上你有一个内存泄漏:当你分配dataArray对象时,它的保留计数为1.但是你将它赋给一个用“retain”属性定义的属性。因此,该属性的setter将再次保留该对象,并将其保留数设为2.当您最终释放时,它将回落到1,但不回到零,因此它不会被释放。

若要解决此问题,而不是将alloc'd对象分配给属性,请将其分配给支持该属性的实例变量。默认情况下,实例变量将具有相同的名称属性,所以你只是做

dataArray = [[NSArray alloc] initWithObjects:@"XXX",@"YYY",@"ZZZ",nil]; 

如果你明确地给出了实例变量的名称,当你合成的属性(通过执行类似@synthesize dataArray = _dataArray,然后使用名。

你有另一种选择是不分配/数组初始化,而是使用arrayWithObjects class method on NSArray。你从后面的对象将被自动释放,所以你不必担心管理它。

3

从我所理解的每个分配 必须有一个解除分配和每个保留的释放。

你理解不正确。每个保留必须有一个释放,但是你不/不应该明确地释放任何东西。

当你需要一个对象时,你应该保留它(并且[[XX alloc] init]为你执行初始保留)。当你不再需要一个对象时,你应该释放你拥有的对象。

这些是简单的规则。没有太多精美的内容,但是有许多语言功能可以帮助您完成规则,并学习一些“交易技巧”(特别是“autorelease”的工作原理)。

0

在第一个中,您不必担心释放该单元格,因为它将由TableView释放,tableView实际上只保留每次都重复使用的固定少量单元格。

对第二个例子只是用一个返回自动释放物体的便利方法:

self.dataArray = [NSArray initwithObject:myObject]; 

因为使用的是保留设定器保留计数将1在端部,这应该在被释放dealloc方法是这样的:

- (void) dealloc 
{ 
    [dataArray release]; 
    [super dealloc]; 
} 

你不应该直接调用的dealloc上viewDidUnload,你需要做的是对任何保留使用二传手,像这样它MAINVIEW释放的子视图:

self.myView = nil; 

这将释放先前的值并指向零。