我正在慢慢研究我的第一个简单计时器应用程序,它开始慢慢复活。目前我没有保存数据,因为当我的应用程序进入后台时,目前在编写我的应用程序时,它总是在我的测试期间保持加载,即使它在后台持续一小段时间。所有这些都是在模拟器上完成的。
我的问题是我有一个带有NSInteger索引属性的表视图控制器
@property NSInteger index;
用于通过调用doWork方法逐步管理NSArray上的慢速迭代。
我的TVC和此属性的初始设置是在为另一个视图的segue准备视图时执行的。每当我的应用程序收到本地通知或观察UIApplicationWillEnterForegroundNotifications时,都会对此属性和其他属性进行更多工作。
所有访问此属性我已经添加了调试日志记录,我只是与我所看到的相混淆
我的TVC的awakeFromNib函数设置了一个通知观察者 如下
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillEnterForegroundNotification
object:nil
queue:mainQueue
usingBlock:^(NSNotification *note) {
[self doWork];
}];
此通知会触发两次! (出于某种原因?)每次都要调用我的doWork方法
我无法理解发生了什么。我的TVC中的大多数属性仍然可能很好,因为我的其余逻辑显示TVC内容继续正常工作。为什么我的NSInteger会被破坏呢?
我想也许线程可能存在一些问题,也许同时发生本地通知处理,我希望添加mainQueue对此有所帮助,我以前将此设置为零。可悲的是,它没有任何区别。
我想知道为什么在仅仅很短的时间内进行背景后自我改变了。天真地我推测,因为一切似乎都在回到前台(视图仍然显示,除了这个NSInteger属性之外所有数据看起来都完好无损),自我ptr和对象将是相同的。可能不会想象它可能以某种方式被操作系统重新安置,但这仍然不应该导致房产改变。
我正在使用cocoa伐木工人进行日志记录,我已关闭ASYNC日志记录,如下所示
#define LOG_ASYNC_ENABLED NO
这应该至少意味着日志调用会阻塞,直到他们记录为止。我可以理解,如果我确实遇到了一些线程问题,那么日志记录顺序可能会略有疑问。但是对于应用程序进入后台后上述属性的初始损坏,从我将0写入属性大约10秒,然后读取-1退出它。这显然不是那时的线程计时问题。
为什么我收到关于两次进入前景的通知?如果我的房产留在我设置它们的地方那就没那么重要了,但仍然让我觉得有些奇怪。
我在这个块中使用self是否有问题,我已经看到有时候你可能想对这些块使用弱自指针,但我已经看到了直接使用self的例子。
任何有关理解和希望解决这个问题的帮助都会非常感激。我有点卡住了,看不出我做错了什么!
干杯
答案 0 :(得分:0)
因此Woofbeans和Phillip Mills解决我的问题的答案是,每次我进入TVC时都会调用我的awakeFromNib,而且我在这些通知中未能删除Observer,导致陈旧的未显示的TVC无限期地停留。我没有意识到这个问题的重要部分。
进入TVC,出来,重新进入,然后你会在应用程序中发现重复的警报,原因是原来的TVC仍然存在,被我内心的强烈引用所强调自己的街区。
我要将这个doWork功能重构到我的模型中,这样它就可以保持并更好地处理,而不管出现的任何视图。
我还改变了我的块代码以在块中使用弱自身指针,希望阻止该块导致任何对象纯粹由于块被遗留而持久存在。
为每个人欢呼!