2012-04-17 21 views
0

我一直在寻找这个问题的解决方案几天,并找到一些类似的帖子,但没有人似乎已经发布了明确的答案停止正在使用的实例从dealloc'd。希望我只是错过了,或有人可以帮助我停止伤害我的大脑..UIAlertViewDelegate类“self”实例在按下按钮之前获取dealloc'd

我有一个类(LKNetworking)这是宣布它符合UIAlertViewDelegate协议。目前它是NSObject的一个子类,但是我尝试了UIResponder,但要么产生相同的问题。

问题是我创建了一个UIAlert视图并将代理设置为self。 UIAlert视图显示OK,但然后调用它的类实例立即被解除分配(就像我在NSLOG中展示的那样),当我点击一个按钮时,该消息被发送到解除分配的实例(LKNetworking alertView:clickedButtonAtIndex:]:发送到释放实例0x6e5ce40)

SO消息,我试图创建.h文件的属性为这样的:

@property (strong, nonatomic) LKNetworking *strongNetworkingProperty 

然后我尝试我的UIAlertView中的委托设置为strongNetworkingProperty伊娃和消息似乎走不通,所以,这没有什么好..

我看到一些答案w这里的人说,设置警戒意见delegatenil,但违背了我的整个目的,因为我需要响应用户选择相应的行动..

这里是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 

任何建议将不胜感激!

感谢

+0

您从不显示正在创建的LKNetworking实例。 – CodaFi 2012-04-17 01:05:18

+0

@CodaFi:LKNetworking从我的AppDelegate实例化,其中原始调用checkGameVersion:被调用。 – Lkabo 2012-04-17 01:13:01

回答

6

如果你希望你的LKNetworking呆在身边,有什么需要参考保持它。这可以是LKNetworking对象本身。在创建警报视图时设置strongNetworkingProperty = self。这将创建一个保留周期,以防止系统释放LKNetworking对象。然后在alertView:clickedButtonAtIndex:中,将strongNetworkingProperty设置为零以中断保留周期。

+0

哇!那样做了!我一直在疯狂,谢谢你!许多! – Lkabo 2012-04-17 01:40:56

+0

我一直在试图弄清楚这个问题。警报是垃圾!谢谢... – 2013-06-18 13:23:47

+0

Hi Rob。你可以请你发布帖子的代码。这里有点混淆。 – Inder 2014-06-22 13:11:29