我是 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 底层使用引用计数系统——每个对象都有一个分配给它的数字(称为保留计数),只有当该数字达到零时,该对象才会被释放。当使用 alloc
、copy
或 new
创建对象时,保留计数设置为 1。当对象被另一个对象保留时, number 增加,当它被释放时它减少(在 ARC 之前的 MRR 系统下,这些是程序员进行的实际方法调用 - retain
和 release
)。 ARC 以相同的方式工作,但只是在编译时自动添加相同的调用)。
所以在这种情况下,ARC 生成的对 release
的隐式调用只是将计数从 2 减 1,但由于它没有达到零,因此对象没有被释放。使计时器无效会将其从运行循环中移除,并导致其被释放。
关于ios - objective-c : memory management with NSTimer objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32297584/