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

标签 objective-c ios automatic-ref-counting

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

举个例子,假设我正在编写一个 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/

相关文章:

ios - 如何从顶部裁剪视频?

objective-c - 关于自动引用计数,我需要了解什么?

swift - 什么时候我们不应该使用 [weak self] 和 [unowned self]?

ios - 在 UITableView 的表格部分下添加文本

objective-c - 在 xib 文件中的 View 上设置类

ios - 从 NSString 中删除重复的单词并另存为新的 NSString

objective-c - ARC 转换问题,它能识别扩展吗?

iphone - 在iphone中全局定义sqlite3数据库

ios - 如何让线程A等到线程B完成,然后再继续线程A?

ios - Xcode, swift ;检测 UIWebView 中的超链接点击