我的uitableview.delegate被设置为null。任何想法为什么,或我如何弄清楚为什么?

时间:2012-03-13 00:24:42

标签: iphone objective-c uitableview delegates

我认为这不是一个常见问题,这使得回答起来有点困难。不过,任何帮助都表示赞赏。

我需要在我的应用程序中多次调用此委托,并且我注意到很多次后,委托开始返回NULL(因此停止响应)。我把一个nslog放在代理被调用的地方,所以我知道在这一点上,没关系:

UIImage *image = [self.delegate largeThumnailForMediaAtIndex:indexPath.row];

然后,下次调用此行时,委托将设置为NULL。它周围没有任何行调用或设置委托。我也在setDelegate方法上放了一个NSLog,并且在更改为NULL之前没有调用它。

您可能需要查看的任何代码,请与我们联系。您希望我尝试的任何想法,也让我知道。

感谢您的帮助。

编辑:奇怪,但可能有助于找到解决方案。我把一个NSTimer scheduledTimer ..放在了让它成为委托的类中,让它每秒触发一次,这样我就可以看到它在任何时候都变为null。然而,我得到的结果是,这次它没有变为空。它返回了所有委托方法。当我拿出计时器时,它会返回NULL。显然,在那里有一个计时器是一个奇怪的解决方案'解决方案'。我希望这会给某人敲响一个钟,并告诉他们问题可能在哪里?

编辑2:我已经解决了这个问题,而不是在我的AppDelegate中使用这段代码:

JCreateViewController *create = [[JCreateViewController alloc] init];
    [create.navigationBar addLeftButtonWithTitle:@"Back" type:JButtonTypeArrow];
   create.navigationBar.title = @"Entry #17";
    [self.window addSubview:create.view];

在我的头文件中声明它,然后使用:

self.create = [[JCreateViewController alloc] init];
    [self.create.navigationBar addLeftButtonWithTitle:@"Back" type:JButtonTypeArrow];
    self.create.navigationBar.title = @"Entry #17";
    [self.window addSubview:self.create.view];

我不明白为什么这会有所作为。如果有人知道的话,我很想知道吗?

1 个答案:

答案 0 :(得分:3)

看起来你正在使用ARC。无论这个目标是什么,没有任何东西拥有它。没有什么强烈的参考,所以它被释放,然后在某些时候它被解除分配。

JCreateViewController *create = [[JCreateViewController alloc] init];

这是一个局部变量。当变量超出方法末尾的范围时,您将无法再访问该对象。在MRR下,这将是一次泄密。在ARC下,对象将会死亡,就像在自动释放池中一样。

self.create = [[JCreateViewController alloc] init];

通过创建属性(大概是strong)并将控制器放入该属性,您已经给出了self对控制器的拥有引用。只要未重新分配属性或将其设置为nil,它就会生效。

计时器固定的东西,因为计时器保留其目标(我认为是控制器(你的问题相当不清楚)),并且计时器本身由运行循环保留。因此,运行循环使重复计时器保持活动状态,计时器使控制器保持活动状态。

简而言之,确保某些东西拥有这个物体并且它会坚持下去。