簡體   English   中英

即使在模擬器上運行,iOS應用程序也會在iPhone上崩潰

[英]iOS app crashes on an iPhone even though it runs on simulator

盡管它在模擬器上運行良好,但我的多視圖應用程序在iPhone 5 C上崩潰了(“很好”,我的意思是沒有內存泄漏,按鈕移動到位時動畫不流暢等)。 該應用程序是用Objective C編寫的,模擬器在Xcode 8.3.3下運行。 手機運行iOS 10.3.3。

當我成功地從VC1切換到VC2到VC3后,按下從SyncViewController切換到PlayViewController即從VC3切換到VC4的同步按鈕時,就會發生問題。 每個ViewController都有一個委托方法,該方法響應上一個ViewController.按下的按鈕ViewController.

崩潰在以下方法中持續發生,該方法在PlayView中顯示三件事:可水平滾動的圖形樂譜,具有每秒被覆蓋的時間顯示的按鈕以及停止按鈕。

- (UIView *)showScoreClockAndExit:(CGRect)panel highlight:(int)currentState seconds:(NSUInteger)clockCount {

    if (!self.seconds) 
    {
    [self.seconds removeFromSuperview];
    self.seconds                            = [[ClockButton alloc] loadClockButton:(NSUInteger)clockCount];
    [self addSubview:_seconds];
    }

    ClockButton *seconds                    = [[ClockButton alloc] loadClockButton:(NSUInteger)clockCount];
    [self addSubview:seconds];

    EscButton *escape                       = [[EscButton alloc]         loadEscButton:(NSString *)@"stop"];
    [self addSubview:escape];

    GraphicScore *score                     = [[GraphicScore alloc] createGraphicScore:(CGRect)panel highlight:(int)currentState];
    [self addSubview:score];

    return self;
}

奇怪的是,即使PlayViewController已經開始從SyncViewController,接管SyncViewController,即先前已由SyncViewController加載的最后一個UIView仍然凍結在設備本身SyncViewController,PlayView已加載, UITimer已設置且所選播放器的播放狀態為啟用,因為調試日志( 如下所示 )清楚顯示

2017-07-24 15:25:24.950097+1000 SatGam2[3052:1712261] PlayView loaded (selectedFamily:1 selectedPlayerID:1)
2017-07-24 15:25:24.950923+1000 SatGam2[3052:1712261] TIME: 00:00
2017-07-24 15:25:24.951905+1000 SatGam2[3052:1712261] ENABLED (player 1: state 0)
(lldb) 

遵循在這里找到的有用線索,我鍵入: bt並按: Enter以獲取以下日志

SatGam2 was compiled with optimization - stepping may behave oddly; variables may not be available.
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0xe15d25d2)
    frame #0: 0x1b300694 libobjc.A.dylib`objc_retain + 4
    frame #1: 0x21291d0a UIKit`-[UIView(Hierarchy) addSubview:] + 18
  * frame #2: 0x000c2696 SatGam2`-[PlayView showScoreClockAndExit:highlight:seconds:](self=0x15e9ed70, _cmd=<unavailable>, panel=<unavailable>, currentState=<unavailable>, clockCount=<unavailable>) at PlayView.m:215 [opt]
    frame #3: 0x000c246c SatGam2`-[PlayView initWithFrame:state:family:player:cue:seconds:](self=<unavailable>, _cmd=<unavailable>, frame=<unavailable>, currentState=<unavailable>, selectedFamily=<unavailable>, selectedPlayerID=<unavailable>, entryString=@"", clockCount=<unavailable>) at PlayView.m:149 [opt]
    frame #4: 0x000cd0da SatGam2`-[PlayViewController nextState](self=0x168aae00, _cmd=<unavailable>) at PlayViewController.m:244 [opt]
    frame #5: 0x000ccc40 SatGam2`-[PlayViewController viewDidLoad](self=0x168aae00, _cmd=<unavailable>) at PlayViewController.m:152 [opt]
    frame #6: 0x2128b27e UIKit`-[UIViewController loadViewIfRequired] + 966
    frame #7: 0x2128aea0 UIKit`-[UIViewController view] + 22
    frame #8: 0x000c1266 SatGam2`-[MultiviewViewController displayView:](self=0x15d85710, _cmd=<unavailable>, intNewView=4) at MultiviewViewController.m:45 [opt]
    frame #9: 0x000c2fb6 SatGam2`-[SyncViewController fromSyncButton:](self=<unavailable>, _cmd=<unavailable>, button=<unavailable>) at SyncViewController.m:65 [opt]
    frame #10: 0x212bf784 UIKit`-[UIApplication sendAction:to:from:forEvent:] + 76
    frame #11: 0x212bf718 UIKit`-[UIControl sendAction:to:forEvent:] + 62
    frame #12: 0x212a9d48 UIKit`-[UIControl _sendActionsForEvents:withEvent:] + 478
    frame #13: 0x212bf054 UIKit`-[UIControl touchesEnded:withEvent:] + 604
    frame #14: 0x212beb9e UIKit`-[UIWindow _sendTouchesForEvent:] + 2094
    frame #15: 0x212b9ade UIKit`-[UIWindow sendEvent:] + 2798
    frame #16: 0x2128b682 UIKit`-[UIApplication sendEvent:] + 308
    frame #17: 0x21a1ede6 UIKit`__dispatchPreprocessedEventFromEventQueue + 2254
    frame #18: 0x21a1978a UIKit`__handleEventQueue + 4186
    frame #19: 0x21a19b6c UIKit`__handleHIDEventFetcherDrain + 144
    frame #20: 0x1c01bfdc CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 12
    frame #21: 0x1c01bb04 CoreFoundation`__CFRunLoopDoSources0 + 424
    frame #22: 0x1c019f50 CoreFoundation`__CFRunLoopRun + 1160
    frame #23: 0x1bf6d1ae CoreFoundation`CFRunLoopRunSpecific + 470
    frame #24: 0x1bf6cfd0 CoreFoundation`CFRunLoopRunInMode + 104
    frame #25: 0x1d717b40 GraphicsServices`GSEventRunModal + 80
    frame #26: 0x212eee12 UIKit`UIApplicationMain + 150
    frame #27: 0x1b75a4ea libdyld.dylib`start + 2
(lldb)

我清除了之前在手機上測試過的所有應用。 我還嘗試了上個月備份的應用程序版本,以消除自從我開始使用deviceMotion以來可能引入的任何問題。 但是問題仍然存在。

有人看到過這樣的東西嗎? 我將從哪里開始? 例如,像我在哪里放置斷點?

此檢查不正確。

if (!self.seconds) 
    {
    [self.seconds removeFromSuperview];
    self.seconds                            = [[ClockButton alloc] loadClockButton:(NSUInteger)clockCount];
    [self addSubview:_seconds];
    }

如果是布爾值,則可以使用!self.seconds。 在這種情況下,self.seconds似乎是一種視圖。 因此,您應該做的是:

if (self.seconds!=nil) {
  [self.seconds removeFromSuperView]; 
  self.seconds                            = [[ClockButton alloc] loadClockButton:(NSUInteger)clockCount];
        [self addSubview:_seconds];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM