objective-c - NSTimer保留计数增加,为什么?

标签 objective-c ios memory-management retaincount

我有关于NSTimer的问题。请参阅以下代码:

NSTimeInterval timeInterval = 1.0f;
SEL selector = @selector(executeDataRefresh);

NSMethodSignature *methodSignature = [[ExecuteDataRefesh class] instanceMethodSignatureForSelector:selector];

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
[invocation setTarget:executeDataRefresh];
[invocation setSelector:selector];

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:  timeInterval invocation:invocation repeats:YES];

现在,每次调用executeDataRefresh方法时,对象executeDataRefresh的保留计数将增加1。因此,一分钟后,保留计数为60。

我知道不应该使用retainCount方法,但是这种方法真的是“不正确的”吗?

怎么会?

最佳答案

NSInvocation保留了它的目标,因为它需要目标在计时器启动时仍然存在。这个事实已经埋在 -[NSInvocation retainArguments] 的文档中:

如果接收者尚未这样做,请保留目标[...]
NSTimer始终指示其NSInvocation保留其参数,因为NSTimer触发之前通常会有延迟。

这就是当有人说“框架类可能在您不知情的情况下保留东西”时的意思。关于Don't worry

您可能要担心的是,*事实是,每次运行此代码(您似乎指示的情况经常发生)时,您正在创建一个新的NSInvocation并重复使用与上次属性完全相同的NSTimer实例,这似乎是浪费内存。

*除非这只是测试代码。

关于objective-c - NSTimer保留计数增加,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7309533/

相关文章:

ios - 导出文本或 pdf

ios - 如果在 tableview iOS 中找不到数据,则无法在中心显示 View ?

c++ - std::vector 在哪里分配内存?

ios - uitableview 滚动期间滞后

ios - 动画 UIBezierPath 从所有圆角到具有左上角和右上角圆角的路径

ios - 为什么DispatchGroup会干扰主队列?

c - 当我之前释放内存时 malloc 是否更快

c# - 当我们在 C# 中重新分配数组时,数组的值是否被破坏?

ios - 更改 iPad 的自动布局约束

ios - 控制 NSSortDescriptor 对 Core Data 中的 nil 值进行排序的方式