将我的应用升级到iOS9后,我的应用中出现错误:
:objc [344]:无法形成类LoginVC的实例(0x15919e00)的弱引用。该对象可能被过度释放,或者正在解除分配。
以下是我收到此错误的函数:
-(void)dismissLogin {
self.isLoggingIn = NO;
[self stopLoginAnimation];
[self dismissViewControllerAnimated:YES completion:NO];
[[NSNotificationCenter defaultCenter] removeObserver:self];
[self.appDelegate setLoginVC:nil];
[self.view removeFromSuperview];
//[APPDEL selectTabBar];
}
应用程序卡在登录屏幕上,并且不会切换到下一个屏幕。
iOS8中没有此错误。 任何人都可以帮我解决这个问题。
答案 0 :(得分:4)
确保您没有使用已取消分配的实例。
我有同样的问题。它不是在iOS 8中发生的,而是在iOS 9中发生的。因为我像这样重写了setDelegate方法。
-(void)setDelegate:(id<UICollectionViewDelegate>)delegate{
_internalDelegate = delegate;
[super setDelegate:self];
}
因此在iOS 9中,操作系统在取消分配时将委托设置为nil,但我将其设置为自己。所以快速修复是
-(void)setDelegate:(id<UICollectionViewDelegate>)delegate{
_internalDelegate = delegate;
if (delegate) {
//Set delegate to self only if original delegate is not nil
[super setDelegate:self];
}else{
[super setDelegate:delegate];
}
}
答案 1 :(得分:0)
我最近遇到了这个问题,这帮助我得出了我的结论。我在上面提供的解决方案中唯一的问题是,如果你需要子类来获得功能,即使它的internalDelegate是nil,它也只是不起作用。
这里提出的解决方案,即使使用nil internalDelegate,也可以防止崩溃并允许功能存在。如果其他人遇到这个问题我想分享。
@property (nonatomic, weak) LoginVC *weakSelf;
- (id)init { if ((self = [super init])) { self.weakSelf = self; } }
- (void)setDelegate:(id)delegate { _internalDelegate = delegate; [super setDelegate:self.weakSelf]; }