防止ARC解除分配当前没有使用但很快就会被淘汰的东西?

Ans*_*ala 5 objective-c ios automatic-ref-counting

我遇到过这个问题几次,想知道正确的方法.

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

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

MyAlertView *alert = [MyAlertView alertWithBlahBlahBlah...];
[alert addButton:@"button" withBlock:^{ ... }];
[alert show];
Run Code Online (Sandbox Code Playgroud)

在警报视图类的某个地方,我们有

- (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]])();
}
Run Code Online (Sandbox Code Playgroud)

因此,警报视图现在显示就好了.问题是,如果我点击一个按钮,它会尝试将buttonPressed:选择器发送到MyAlertView显示的对象.在MyAlertView已,然而,从此时的上海华删除.ARC决定由于警报视图不再由任何人拥有,因此应该取消分配,而不知道按钮将来需要发送消息.点击按钮时会导致崩溃.

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

lna*_*ger 7

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

最明显的方法是使用班级中的属性.既然你说你不想这样做(也许你有很多),那么另一个可能的解决方案是保留一组你计划重用并最终解除分配的缓存对象.