几天来我一直在寻找解决这个问题的方法,并且发现了一些类似的帖子,但是似乎没有人发布过明确的答案,说明如何阻止正在使用的实例停止进行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/