1

当我从 中弹出一个UIViewController实例时UINavigationController,我发现它的属性仍然存在(NSTimers保持计时、AVAudioPlayers继续播放等)。我想知道我的方法有什么问题?

我以这种方式将 UIViewController 实例推送到 UINavigationController 上:

- (IBAction)buttonPressed:(id)sender {
    UINavigationController *nc=[self navigationController];
    NewViewController *nvc=[[NewViewController alloc] init];
    [nvc setNameToUse:[self nameToUse]];
    [nc pushViewController:nvc2 animated:YES];
}

NewViewController 有一个子视图控制器,它是通过 NiewViewController 的 viewDidLoad 方法添加的:

self.mySubViewController=[[SubViewViewController alloc] initWithName:self.nameToUse];
self.mySubViewController.view.frame=CGRectMake(0,
                                           0,
                                           self.mySubViewController.view.frame.size.width,
                                           self.mySubViewController.view.frame.size.height);
[self.view addSubview:self.mySubViewController.view];

当 NewViewController 弹出时,SubViewController 的属性不会消失。其中一个特别是计时器,声明如下:

@property (nonatomic) NSTimer *aTimer;

对此的任何建议都会很棒。我希望通过解决这个问题,偶尔发生的崩溃(在应用程序运行 45 分钟左右之后)将停止!或者至少我会更好地了解导致它们的原因...... :) 感谢您的阅读。

4

2 回答 2

2

NSTimer保留它的目标,如果您传递 self (您的SubViewViewController),那么您将在视图控制器和计时器之间创建一个保留周期。

于 2013-09-05T14:18:52.830 回答
0

简单地将 SubViewController 的视图添加到 ViewController 不会正确传递事件。

您需要正确实现 UIViewController 子容器,例如:

所以你的第二个代码块应该是这样的:

[self addChildViewController:self.mySubViewController];
[self.view addSubview:self.mySubViewController.view];
[self.mySubViewController didMoveToParentViewController:self];
于 2013-09-05T14:19:00.080 回答