gpt4 book ai didi

objective-c - 委托(delegate)和保留周期?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:20:36 26 4
gpt4 key购买 nike

编辑:我真的很抱歉。我编辑了我在帖子中犯下的令人困惑的错误。

我在 WhereamiViewController.h 中声明了这些 ivars:

CLLocationManager *locationManager;
IBOutlet MKMapView *worldView;
IBOutlet UITextField *locationTitleField;

作者写道,由于 WhereamiViewController 拥有 locationManager 并且 locationManager 的 委托(delegate)是 WhereamiViewControllerlocationManager 委托(delegate)必须在 WhereamiViewController 的 dealloc 方法中设置为 nil 因为委托(delegate)是 assigned 而不是。在 .xib 文件中,worldViewlocationTitleField 被设置为委托(delegate) File's Owner,但为什么不当两个委托(delegate)都是 assign 而不是 weak 时,需要将两个委托(delegate)设置为 nil 吗?

PS: 是用ARC

最佳答案

locationManager must be set to nil in the WhereamiViewController's dealloc method

CLLocationManager不保留其委托(delegate)。即使它确实在 dealloc 中将 locationManager 设置为 nil 也不会破坏保留周期,因为保留周期会导致 dealloc 永远不会被调用。需要有一些其他事件来打破保留周期,例如关闭/弹出 View Controller 。

but why don't those two need to be set to nil?

如果记录到该类不保留委托(delegate),那么您不必担心保留周期。有时,文档来自仅查看头文件并查找 assign 而不是 strongretainCLLocationManager 不保留其委托(delegate),因此您不必将 locationManager 分配给 nil。但是,如果 locationManager 在您的类被释放后仍可能接收事件,您应该在 dealloc 方法中将其委托(delegate)设置为 nil 以防止回调在你的类(class)被解除分配之后。

- (void)dealloc
{
//Prevent callbacks after dealloc
//Useful if locationManager is a singleton or used elsewhere
locationManager.delegate = nil;

[locationManager release]; //If not ARC
[super dealloc];//If not ARC
}

关于objective-c - 委托(delegate)和保留周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11937446/

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