UIAlertViewDelegate类“self”实例在按下按钮之前被dealloc'd

时间:2012-04-17 00:48:36

标签: iphone ios xcode ios5

我一直在寻找这个问题的解决方案几天,并且发现了一些类似的帖子,但似乎没有人发布一个明确的答案,如何停止我正在使用的实例获得dealloc'd 。希望我错过了它,或者有人可以帮助我停止摧毁我的大脑..

我有一个类(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

任何建议都将不胜感激!

由于

1 个答案:

答案 0 :(得分:6)

如果你想让你的LKNetworking留在身边,有些东西需要继续引用它。那个东西可以是LKNetworking对象本身。在创建警报视图时设置strongNetworkingProperty = self。这将创建一个保留周期,以防止系统取消分配LKNetworking对象。然后在alertView:clickedButtonAtIndex:中,将strongNetworkingProperty设置为nil以打破保留周期。