我已经多次遇到这个问题,想知道正确的方法。
例如,假设我正在编写一个 iPhone 应用程序,并且我想要一个使用块的自定义警报视图类。
所以我写了这个类,然后在我的代码中我去:
MyAlertView *alert = [MyAlertView alertWithBlahBlahBlah...];
[alert addButton:@"button" withBlock:^{ ... }];
[alert show];
在警报视图类的某个地方,我们有
- (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]])();
}
因此,警报视图现在显示得很好。问题是,如果我点击一个按钮,它会尝试将buttonPressed:
选择器发送到MyAlertView
显示的对象。但是,此时MyAlertView
已将其从超级视图中删除。ARC 决定,因为警报视图不再由任何人拥有,它应该被解除分配,不知道按钮将来需要向它发送消息。当点击按钮时,这会导致崩溃。
将警报视图保留在内存中的正确方法是什么?我可以使该MyAlertView
对象成为使用它的类的属性,但这有点愚蠢(如果我想一次显示两个警报怎么办?)。