gpt4 book ai didi

objective-c - 防止 ARC 取消分配当前未使用但很快就会使用的东西?

转载 作者:可可西里 更新时间:2023-11-01 04:23:55 26 4
gpt4 key购买 nike

我遇到过几次这个问题,想知道应该采取的正确方法。

举个例子,假设我正在编写一个 iPhone 应用程序,我想要一个使用 block 的自定义警报 View 类。

所以我写了这个类,然后在我的代码中:

MyAlertView *alert = [MyAlertView alertWithBlahBlahBlah...];
[alert addButton:@"button" withBlock:^{ ... }];
[alert show];

在警报 View 类的某处,我们有

- (void)addButton:(NSString *)button withBlock:(void (^))block {
[_blocks setObject:[block copy] forKey:button];
}

- (void)show {
... drawing stuff ...
UIButton *button = ...
[button addTarget:self selector:@selector(buttonPressed:) ...];
...
}

- (void)buttonPressed:(id)sender {
((void (^)())[_blocks objectForKey:[sender title]])();
}

因此,警报 View 现在显示得很好。问题是,如果我点击一个按钮,它会尝试将 buttonPressed: 选择器发送到显示的 MyAlertView 对象。但是,此时 MyAlertView 已从 super View 中删除。 ARC 决定因为警告 View 不再为任何人所有,所以应该释放它,因为它不知道将来需要一个按钮向它发送消息。这会在点击按钮时导致崩溃。

将警报 View 保存在内存中的正确方法是什么?我可以使 MyAlertView 对象成为使用它的类的属性,但这有点愚蠢(如果我想同时显示两个警报怎么办?)。

最佳答案

如果一个对象保留在内存中,而您没有对它的引用,这称为内存泄漏。正如我在评论中所说,您需要保留对它的某种引用,以便 a) 它不会被释放,b) 您可以向它发送消息,并且 c) 您可以释放它在你的类(class)被解除分配之前。

最明显的方法是使用类中的属性。既然您说过您不想这样做(也许您有很多),那么另一种可能的解决方案是保留一组您计划重用并最终取消分配的缓存对象。

关于objective-c - 防止 ARC 取消分配当前未使用但很快就会使用的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11642073/

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