gpt4 book ai didi

iphone - UIAlertViewDelegate 类 "self"实例在按下按钮之前被释放

转载 作者:行者123 更新时间:2023-11-28 18:25:38 25 4
gpt4 key购买 nike

几天来我一直在寻找这个问题的解决方案并找到了一些类似的帖子,但似乎没有人发布关于如何阻止我正在使用的实例获得 dealloc's 的明确答案.希望我只是错过了它,或者有人可以帮助我停止伤脑筋..

我有一个类 (LKNetworking),它声明它符合 UIAlertViewDelegate 协议(protocol)。目前它是 NSObject 的子类,但是我已经尝试过 UIResponder 但两者都会产生相同的问题。

问题是我创建了一个 UIAlert View 并将委托(delegate)设置为 self。 UIAlert View 显示 OK,但是随后调用它的 LKNetworking Class 实例立即解除分配(如我在 NSLOG 中所示),当我单击一个按钮时,消息被发送到一个解除分配的实例( LKNetworking alertView:clickedButtonAtIndex:]: 消息发送到释放实例 0x6e5ce40)

所以,我尝试在 .h 文件中创建一个属性:

@property (strong, nonatomic) LKNetworking *strongNetworkingProperty

然后我尝试将我的 UIAlertView 的委托(delegate)设置为 strongNetworkingProperty ivar,但消息似乎无处可去,所以这不好..

我看到一些答案,人们说要将警报 View delegate 设置为 nil,但这违背了我的全部目的,因为我需要相应地响应用户选择..

这里是调用警报的 LKNetworking 方法和 delegate 方法的示例代码:

-(void)checkGameServerVersion: (float) serverGameVersion {
if (serverGameVersion == GAMEVER) {
NSLog(@"matched");
// Continue flow here..
} else {
NSLog(@"not matched");
//Game version does not match, end game, force upgrade
UIAlertView *oldVersion = [[UIAlertView alloc]initWithTitle:@"Ugrade Required" message:@"A new game version is available, Please update your game and try again." delegate:self cancelButtonTitle:@"Quit" otherButtonTitles: nil];
[oldVersion show];
}
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
NSLog(@"button = %d",buttonIndex);
if (buttonIndex == 0 ) {
NSLog(@"pressed button 0, quitting gam");
}
}
@end

如有任何建议,我们将不胜感激!

谢谢

最佳答案

如果您希望您的 LKNetworking 保留下来,则需要有一些东西来保留对它的引用。这个东西可以是 LKNetworking 对象本身。创建警报 View 时设置 strongNetworkingProperty = self。这会创建一个保留循环,以防止系统释放 LKNetworking 对象。然后在 alertView:clickedButtonAtIndex: 中,将 strongNetworkingProperty 设置为 nil 以打破保留周期。

关于iphone - UIAlertViewDelegate 类 "self"实例在按下按钮之前被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10183661/

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