升级到iOS9后登录流程失败

时间:2015-09-29 11:41:02

标签: ios objective-c iphone ios9

将我的应用升级到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中没有此错误。 任何人都可以帮我解决这个问题。

2 个答案:

答案 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,也可以防止崩溃并允许功能存在。如果其他人遇到这个问题我想分享。

  1. 创建第二个内部属性,我称之为weakSelf
  2. @property (nonatomic, weak) LoginVC *weakSelf;
    
    1. 在任何初始化方法中,将weakSelf设置为self
    2.  - (id)init {
          if ((self = [super init])) {
              self.weakSelf = self;
          }
      }
      
      1. 更新委托方法
      2. - (void)setDelegate:(id)delegate {
            _internalDelegate = delegate;
            [super setDelegate:self.weakSelf];
        }