【问题标题】:UIAlertViewDelegate class "self" instance gets dealloc'd before button gets pressedUIAlertViewDelegate 类“self”实例在按钮被按下之前被释放
【发布时间】:2012-04-17 00:48:35
【问题描述】:

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

我有一个类 (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 实例。
  • @CodaFi:LKNetworking 从我的 AppDelegate 中实例化,其中对 checkGameVersion: 的原始调用被调用。

标签: iphone ios xcode ios5


【解决方案1】:

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

【讨论】:

  • 哇!做到了!我已经疯了,谢谢SOO!很多!
  • 嗨,罗伯。您能否为您的帖子发布代码。 M 这里有点混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
相关资源
最近更新 更多