自动释放和选择器

时间:2011-02-10 04:00:54

标签: iphone objective-c ios memory-management

我对是否使用UIView addTarget:action感到困惑:导致该视图被保留。具体来说,我有一个带有自定义单元格视图的UITableView,它们在视图控制器上注册了一个事件。这些单元格视图是自动释放的。

UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

UIView *cellView = [[UIView alloc] initWithFrame:viewRect];


[cellView addTarget:self action:@selector(dosSomething:) forControlEvents:UIControlEventTouchUpInside]; //is this not a good idea?

[cellView autorelease]; //will this get released?
}

2 个答案:

答案 0 :(得分:1)

addTarget:action:forControlEvent:不会以任何方式影响视图的保留计数。你现在拨打autorelease的方式很好;您的视图将被放置在自动释放池中并最终释放。

请注意,要使您的视图有用,您必须将其作为子视图添加到其他视图(例如您的单元格)。该视图会将其保留在那里,因为它会占用您的视图,但通过在此处调用autorelease,您可以正确处理事情。

答案 1 :(得分:0)

你可以在这里发布cellView。释放cellView没有问题,它不会导致任何崩溃。但请确保您稍后未在函数中使用此视图,并在释放cellView之前将cellView添加到单元格的内容视图中。

UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

UIView *cellView = [[UIView alloc] initWithFrame:viewRect];


[cellView addTarget:self action:@selector(dosSomething:) forControlEvents:UIControlEventTouchUpInside]; //is this not a good idea?

[cell.contentView addSubView:cellView];

[cellView release]; //will this get released?
}

这将完美无缺。