gpt4 book ai didi

ios - 与委托(delegate)的内存管理?

转载 作者:可可西里 更新时间:2023-11-01 05:48:26 24 4
gpt4 key购买 nike

委托(delegate)的内存管理,据我了解,我不保留委托(delegate),如果 View 被卸载(通过 viewDidUnload)然后重新创建(通过 viewDidLoad),我有点不确定如何处理委托(delegate)?

@property(assign) SomeClass *someDelegate;

.

- (void)viewDidLoad {
[super viewDidLoad];
someDelegate = [[SomeClass alloc] init];
[someDelegate setDelegate:self];
}

-(void)viewDidUnload {
[super viewDidUnload];
[self setSomeDelegate:nil];
}

-(void)dealloc {
[super dealloc];
}

PS:我可能走错了路,我只是想解决这个问题......

欢呼加里

最佳答案

如果您对您的属性使用 assign,则您不是在对象上调用 retain。

这意味着您绝对不应该对其调用 release 或 autorelease!

你在 dealloc 中的行

[someDelegate release];

将在未来的某个时候导致崩溃 - 你应该将其删除。您无需关心 dealloc 方法中分配的属性。

你的线路

[self setSomeDelegate:nil];

不会泄漏。


但是,您的 viewDidLoad 方法中似乎有 [[someDelegate alloc] init]。这是不寻常的;委托(delegate)是外部对象很正常,不是自己做的。在你的情况下,它并不是真正的委托(delegate),它只是一个为你做某事的对象 - 你应该重命名它并将属性更改为保留(并记住在 dealloc 中释放它)。

目前,如果您的属性设置为 (assign) 而其他人设置了它,您将泄漏您的初始委托(delegate)。如果你只在这个类中使用委托(delegate),也许它根本不应该是一个属性?如果你只是想从你的课外阅读它,你可以使用 (readonly) 而不是分配(并将 [self setSomeDelegate:nil] 更改为 someDelegate=nil; )

您在 viewDidUnload 中将委托(delegate)设置为 nil 的行删除了您在第二条评论中提出的问题 - 您正在删除委托(delegate),因此当您到达 viewDidLoad 同样,您的委托(delegate)已经为零 :)

关于ios - 与委托(delegate)的内存管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3094449/

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