iphone – iOS开发:为什么我的视图控制器的保留计数如此奇怪?

iphone – iOS开发:为什么我的视图控制器的保留计数如此奇怪?,第1张

概述我正在深入研究iOS开发,我正在构建一个基于导航的应用程序,该应用程序未完全释放被推送到导航堆栈的其中一个视图.这是有问题的,因为视图控制器永远不会被释放,因此每次将视图控制器推入堆栈时,它使用的内存就会建立起来.因此在调查问题后,我发现视图控制器的保留计数非常奇怪.一旦倒计时器达到零,所讨论的视图控制器就被推到堆栈. 这是在计时器回调中创建视图控制器的代码,显示其保留计数,并将其推送到导航堆栈… 我正在深入研究iOS开发,我正在构建一个基于导航的应用程序,该应用程序未完全释放被推送到导航堆栈的其中一个视图.这是有问题的,因为视图控制器永远不会被释放,因此每次将视图控制器推入堆栈时,它使用的内存就会建立起来.因此在调查问题后,我发现视图控制器的保留计数非常奇怪.一旦倒计时器达到零,所讨论的视图控制器就被推到堆栈.

这是在计时器回调中创建视图控制器的代码,显示其保留计数,并将其推送到导航堆栈…

-(voID)updateCountDownTimer   //defined in MyVIEwController_A class{    [self setTimeRemaining:([self timeRemaining] - 1)];    [[self countDownLabel] setAlpha:1];    [[self countDownLabel] setText:[Nsstring stringWithFormat:@"%d",[self timeRemaining]]];    //Fade out the current time    [UIVIEw beginAnimations:@"FadeAnimation" context:nil];    [UIVIEw setAnimationDuration:1];    [[self countDownLabel] setAlpha:0];    [UIVIEw commitAnimations];      if ([self timeRemaining] == 0)     {               MyVIEwController_B *myvc_b = [[MyVIEwController_B alloc] initWithNibname:@"MyVIEw_B_iPhone" bundle:nil];        [[self navigationController] pushVIEwController:myvc_b animated:YES];        NSLog(@"updateCountDownTimer: %d",[myvc_b retainCount]);        [myvc_b release];        [[self countDownTimer] invalIDate];        [[self countDownLabel] setHIDden:YES];    }}

这是在按下暂停按钮后将视图控制器d出导航堆栈的代码…

- (voID)pausebuttonpressed:(ID)sender{    //Stop the timer    [puzzleTimer invalIDate];    NSLog(@"pausebuttonpressed before pop: %d",[self retainCount]);    //return to the prevIoUs vIEw    [[self navigationController] popVIEwControllerAnimated:YES];    NSLog(@"pausebuttonpressed after pop: %d",[self retainCount]);}

这是控制台输出,显示整个过程中非常奇怪的保留计数…

2010-12-02 17:50:38.062 MyApp[821:307] updateCountDownTimer: 52010-12-02 17:50:40.453 MyApp[821:307] pausebuttonpressed before pop: 22010-12-02 17:50:40.462 MyApp[821:307] pausebuttonpressed after pop: 4

我是iOS开发的新手,但代码对我来说似乎很简单,所以我不知道我缺少什么.

非常感谢您的智慧!

更新:看起来Leaks仪器报告了将前一个视图控制器推入堆栈的代码行上的泄漏(即负责推送视图控制器的视图控制器).代码再次非常简单,所以我不知道它为什么报告泄漏……

MyVIEwController_A *myvc_a = [[MyVIEwController_A alloc] initWithNibname:@"MyVIEw_A_iPhone" bundle:nil];[[self navigationController] pushVIEwController:myvc_a animated:YES]; //<--Leak being reported here[myvc_a release];

*更新:*发现问题,就像每个人都在说和下面评论中发布的链接中显示的问题一样,我的活动对象仍然引用我的视图控制器,这阻止了它的解除分配.在我的情况下,我有两个定时器瞄准我的视图控制器,这些定时器在我从堆栈d出视图之前没有失效,这意味着有两个活动对象仍然引用视图控制器.这是我在Apple文档中找到的一个片段,揭示了这个问题……

Perhaps more importantly,a timer also
maintains a strong reference to its
target. This means that as long as a
timer remains valID (and you otherwise
properly abIDe by memory management
rules),its target will not be
deallocated.

无论如何,再次感谢所有帮助过的人!

解决方法 就内存管理而言,您的代码没有任何问题.

您不应该依赖保留计数来检查您的对象是否正在被正确释放,因为系统也将保留它所需要的并在适当时释放.例如,当您将视图控制器添加到堆栈时,它会被导航控制器及其子视图保留,当它d出时,它会发送一条释放消息,传播其所有子视图.

一般规则是,如果您分配,保留或复制对象,则您有责任将其释放.其他所有内容都由系统处理,并将使用自动释放池进行刷新.

总结

以上是内存溢出为你收集整理的iphone – iOS开发:为什么我的视图控制器的保留计数如此奇怪?全部内容,希望文章能够帮你解决iphone – iOS开发:为什么我的视图控制器的保留计数如此奇怪?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1080257.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存