当app在后台时,TableViewController属性会发生变化

时间:2014-04-10 21:33:50

标签: ios background-process nsnotificationcenter nsinteger foregroundnotification

我正在慢慢研究我的第一个简单计时器应用程序,它开始慢慢复活。目前我没有保存数据,因为当我的应用程序进入后台时,目前在编写我的应用程序时,它总是在我的测试期间保持加载,即使它在后台持续一小段时间。所有这些都是在模拟器上完成的。

我的问题是我有一个带有NSInteger索引属性的表视图控制器

   @property NSInteger index;

用于通过调用doWork方法逐步管理NSArray上的慢速迭代。

我的TVC和此属性的初始设置是在为另一个视图的segue准备视图时执行的。每当我的应用程序收到本地通知或观察UIApplicationWillEnterForegroundNotifications时,都会对此属性和其他属性进行更多工作。

所有访问此属性我已经添加了调试日志记录,我只是与我所看到的相混淆

  • PrepareForSegue
    • @ 19:38:29:058 - 调用方法doWork,将我的属性从-1增加到0,并设置本地通知。日志显示self = 0x10bb661f0
  • 我按下主页按钮将我的应用程序放在后台约10秒
  • 点击本地通知,然后点按横幅以将我的应用程序恢复为焦点
  • 我的TVC的awakeFromNib函数设置了一个通知观察者 如下

    NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
    [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillEnterForegroundNotification 
                                                      object:nil
                                                       queue:mainQueue
                                                  usingBlock:^(NSNotification *note) {
                                                   [self doWork];
                                            }];
    
  • 此通知会触发两次! (出于某种原因?)每次都要调用我的doWork方法

    • @ 19:38:45:832 - doWork立即显示我的属性现在回到-1而不是它在被设置为背景之前被设置为0,它再次递增到0.此外,它在self =处显示self不同0x10974bbd0,当应用程序被预设时,它现在仍然存在的值。
    • @ 19:38:45:836 - 从第二次通知调用中再次调用doWork,我的属性在上次调用时正确地现在仍为0,它再次递增为1.
  • 之后,我的app委托也得到了它调用的didReceiveLocalNotification方法,它最终也会通过Notification Center观察器设置中的另一个块调用相同的doWork方法,与上面详述的相同。
    • @ 19:38:45:857 - 调用doWork并再次将属性从已设置的1恢复为0 ......再次增加到1。

我无法理解发生了什么。我的TVC中的大多数属性仍然可能很好,因为我的其余逻辑显示TVC内容继续正常工作。为什么我的NSInteger会被破坏呢?

我想也许线程可能存在一些问题,也许同时发生本地通知处理,我希望添加mainQueue对此有所帮助,我以前将此设置为零。可悲的是,它没有任何区别。

我想知道为什么在仅仅很短的时间内进行背景后自我改变了。天真地我推测,因为一切似乎都在回到前台(视图仍然显示,除了这个NSInteger属性之外所有数据看起来都完好无损),自我ptr和对象将是相同的。可能不会想象它可能以某种方式被操作系统重新安置,但这仍然不应该导致房产改变。

我正在使用cocoa伐木工人进行日志记录,我已关闭ASYNC日志记录,如下所示

    #define LOG_ASYNC_ENABLED NO 

这应该至少意味着日志调用会阻塞,直到他们记录为止。我可以理解,如果我确实遇到了一些线程问题,那么日志记录顺序可能会略有疑问。但是对于应用程序进入后台后上述属性的初始损坏,从我将0写入属性大约10秒,然后读取-1退出它。这显然不是那时的线程计时问题。

为什么我收到关于两次进入前景的通知?如果我的房产留在我设置它们的地方那就没那么重要了,但仍然让我觉得有些奇怪。

我在这个块中使用self是否有问题,我已经看到有时候你可能想对这些块使用弱自指针,但我已经看到了直接使用self的例子。

任何有关理解和希望解决这个问题的帮助都会非常感激。我有点卡住了,看不出我做错了什么!

干杯

1 个答案:

答案 0 :(得分:0)

因此Woofbeans和Phillip Mills解决我的问题的答案是,每次我进入TVC时都会调用我的awakeFromNib,而且我在这些通知中未能删除Observer,导致陈旧的未显示的TVC无限期地停留。我没有意识到这个问题的重要部分。

进入TVC,出来,重新进入,然后你会在应用程序中发现重复的警报,原因是原来的TVC仍然存在,被我内心的强烈引用所强调自己的街区。

我要将这个doWork功能重构到我的模型中,这样它就可以保持并更好地处理,而不管出现的任何视图。

我还改变了我的块代码以在块中使用弱自身指针,希望阻止该块导致任何对象纯粹由于块被遗留而持久存在。

为每个人欢呼!