gpt4 book ai didi

objective-c - 对 performSelector :withObject:afterDelay:inModes 保留计数的影响

转载 作者:行者123 更新时间:2023-12-02 05:29:14 29 4
gpt4 key购买 nike

一个简单的程序:

-(void)doSomething {

NSLog(@"self rc=%d", [self retainCount]);

[self performSelector:@selector(doMe:) withObject:nil afterDelay:0 inModes:[NSArray arrayWithObject:NSDefaultRunLoopMode]];

NSLog(@"self rc=%d", [self retainCount]);
}

-(void)doMe:(id)object {

NSLog(@"i'm done");

NSLog(@"self rc=%d", [self retainCount]);

}

输出:

self rc=1

self rc=2

i'm done

self rc=2

为什么保留计数会增加并保持在 2?

最佳答案

来自-[NSObject performSelector:withObject:afterDelay:inModes:] documentation :

2013/11/01 回答

正如预期的那样,文档似乎已更新,现在他们没有说目标对象已保留,但他们仍然提到运行循环中的计划计时器。

如果使用 NSTimer,则对象必须由某人保留,否则将无法保证选择器可以执行,因为没有人可以保证对象仍然存在。如果不使用 ARC 的 weak,它将崩溃。在我看来,Apple 对其文档进行了编辑,没有提及实现细节,尽管我认为这很明显。

上面的文档根本没有提到 retain 这个词,但这并不意味着目标没有被保留。

这是我在模拟器iOS7.0的调试器中试过的:

(lldb) p (int)[self retainCount]
(int) $1 = 8
(lldb) expr (void)[self performSelector:@selector(description) withObject:nil afterDelay:1.0]
(lldb) p (int)[self retainCount]
(int) $2 = 9
(lldb) expr (void)[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(description) object:nil]
(lldb) p (int)[self retainCount]
(int) $3 = 8

结论:对象被保留了,但不是我们应该关心的。先生解决了:p


上一个答案:(仍然有效)

This method retains the receiver and the anArgument parameter until after the selector is performed.

因为如果不保留该对象,该对象可能会在执行之前被释放,您的应用程序将崩溃。

当您设置并尝试使用 NSTimers 触发方法时,逻辑相同。如果目标对象不再存在(已释放),当计时器实际触发时,您的应用程序将崩溃。所以 performSelector:withObject:afterDelay:... 和它的 friend 在这里让我们的生活更轻松一点,因为它确保应用程序不会在计时器被触发时崩溃;)

希望对你有帮助

关于objective-c - 对 performSelector :withObject:afterDelay:inModes 保留计数的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4414699/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com