0

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

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

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

所以,我试图在 .h 文件中创建一个属性,如下所示:

@property (strong, nonatomic) LKNetworking *strongNetworkingProperty

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

我看到了一些答案,人们说将警报视图设置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

任何建议将不胜感激!

谢谢

4

1 回答 1

6

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

于 2012-04-17T01:34:35.857 回答