ios - objective-c : memory management with NSTimer objects

标签 ios objective-c automatic-ref-counting nstimer release

我是 Objective C 编程的新手,我来自 C++,会更好地理解 ARC 内存管理;如果我有以下情况:

-(void) test_method
{
 NSTimer* t=[NSTimer ScheduledTimerWithTimeInterval:2
 target:self  selector;@selector(exec_method) userinfo:nil repeats:YES];
}

在方法的末尾,我预计会丢失引用 t,因此,对于 ARC,自动调用 release 并因此释放 NSTimer 对象,相反它似乎仍在内存中(exec_method 重复它每 2 秒执行一次)。或者当系统需要内存空间时它会被释放?

最佳答案

您确实正确理解了 ARC - 这只是一个稍微不明显的情况,因为有一个您看不到的对您的对象的额外强引用。 NSTimer 没有按预期运行,因为它被安排在运行循环上这一事实意味着它也保留在那里。因此,当您的本地消失时,该对象仍保留在内存中。

ARC 底层使用引用计数系统——每个对象都有一个分配给它的数字(称为保留计数),只有当该数字达到零时,该对象才会被释放。当使用 alloccopynew 创建对象时,保留计数设置为 1。当对象被另一个对象保留时, number 增加,当它被释放时它减少(在 ARC 之前的 MRR 系统下,这些是程序员进行的实际方法调用 - retainrelease)。 ARC 以相同的方式工作,但只是在编译时自动添加相同的调用)。

所以在这种情况下,ARC 生成的对 release 的隐式调用只是将计数从 2 减 1,但由于它没有达到零,因此对象没有被释放。使计时器无效会将其从运行循环中移除,并导致其被释放。

关于ios - objective-c : memory management with NSTimer objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32297584/

相关文章:

ios - UIPageControl 未更新,甚至值已更改

iphone - AVMutableVideoComposition 中的淡入淡出

iphone - 我什么时候需要同时拥有 iVar 和属性(property)?

objective-c - ARC什么时候工作?编译还是运行时?

ios - 有什么方法可以在 RestKit 0.20 中指定带有参数的路径模式?

ios - 对访问数组中的可变字典感到困惑

iphone - iOS5 ARC 应用程序 : __NSAutoreleaseNoPool(): of class NSCFNumber autoreleased with no pool in place - just leaking

objective-c - 弱自引用的通用类型

ios - 将 NSString 转换为 NSDictionary

iphone - 如何在 UIImageView 中设置图片