0

我理解调用的原因 message sent to deallocated instance 0xebba1b0,这是因为我正在向不再在内存中的对象发送消息。

所以这是我的场景。我有一个 ZoomedViewController,里面有一个 UITableView。UITableView 有一个自定义的 UITableViewCell,它有一个属性标签作为子视图。当在属性标签上按下链接时(这反过来会触发 didSelectRowAtIndexPath),它会委托给我的 MainViewController 并在 MainViewController 中调用 closeZoomedImageVC 方法:

-(void) closeZoomedImageVC
{
    [self.zoomedImageContainer_ removeFromParentViewController];
    [self.zoomedImageContainer_.view removeFromSuperview];
}

问题是当触发 didSelectRowAtIndexPath 时, zoomedImageContainer_ 已经消失了。那我该如何解决呢?

为了更好地说明这一点,基本上当我这样做时:

 [self performSelector:@selector(closeZoomedImageVC) withObject:nil afterDelay:1.0];

这不再导致崩溃,但这不是解决方案,因为它很hacky。它的作用是让 didSelectRowAtIndexPath 在被释放之前首先被执行。

4

3 回答 3

2

存储对您的UITableViewin的引用ZoomedViewController

@property (nonatomic, strong) IBOutlet UITableView *tableView;

确保在 Interface Builder 中连接插座。现在,当您被删除时,在您释放该引用之前zoomedImageContainer_.view它不会解除分配。UITableView

您还需要存储对in的strong引用,并且仅在将所选行保存回 in 后才将其设置为。ZoomedViewControllerMainViewControllernilMainViewController

于 2012-08-30T03:53:39.640 回答
0

当点击表格中的单元格时会调用动画以突出显示选定的单元格,并且它需要很短的持续时间才能完成,所以最好的方法是你正在做的事情,延迟后执行选择器,我认为 0.5 秒就足够了。

于 2012-08-30T04:09:07.990 回答
0

我发现我自己的解决方案是在 tableView 属性中设置 allowSelection = NO 。这将让 UITableViewCell 中的属性标签进行交互,但会禁用 didSelectRowAtIndexPath 被调用

于 2012-08-30T04:11:32.887 回答