我对是否使用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?
}
答案 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?
}
这将完美无缺。