几天来我一直在寻找解决这个问题的方法,并且发现了一些类似的帖子,但是似乎没有人发布过明确的答案,说明如何阻止正在使用的实例停止进行dealloc。希望我只是想念它,或者有人可以帮助我停止扭动我的大脑。

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

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

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

@property (strong, nonatomic) LKNetworking *strongNetworkingProperty


然后,我尝试将UIAlertView的委托设置为strongNetworkingProperty ivar,消息似乎无处可寻,所以那就不好了。

我看到有人回答说将警报视图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对象本身。创建警报视图时,设置strongNetworkingProperty = self。这将创建一个保留周期,以防止系统取消分配LKNetworking对象。然后在alertView:clickedButtonAtIndex:中,将strongNetworkingProperty设置为nil,以打破保留周期。

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

10-11 23:08