2012-06-02 121 views
0

好吧..這裏是整個場景EXC_BAD_ACCESS使用[UIView的animateWithDuration:動畫:完成]

的概念是,以顯示與用戶能夠滑塊向左或向右看看下一個屏幕上的多個訂單。一旦訂單被接受或拒絕,訂單視圖就會下滑,並被訂單視圖旁邊的一個或之前的訂單視圖替代,如果訂單結束。

我有一個tabbar視圖,其中包含一個簡單的UIScrollView和幾個按鈕(接受&拒絕)。在ViewDidLoad中,我準備了一個Orders數組,使用Nib文件初始化ViewControllers(等於總訂單),並將這些ViewController的視圖添加到ScrollView中,並設置ScrollView的內容大小等。(用於垂直滾動&)

當用戶點擊AcceptButton時,會執行動畫,將UIScrollView中的可見視圖向下滑動,然後將其從超級視圖中移除。

動畫代碼執行如下。

BOOL lastPage = NO; 
    BOOL ordersEmpty = NO; 
    if (self.views.count == 1){ 
     ordersEmpty = YES; 
     lastPage = YES; 
    } 

    UIViewController *controller2; 
    if (self.views.count == page+1 && !ordersEmpty){ 
     lastPage = YES; 
     controller2 = [self.views objectAtIndex:page-1]; 
    } else if (!ordersEmpty){ 
     controller2 = [self.views objectAtIndex:page+1]; 
    } 
    [UIView animateWithDuration:1.5 animations:^{ 
     CGRect frame = controller.view.frame; 
     frame.origin.y = frame.size.height + 100; 
     controller.view.frame = frame; 

     if (lastPage == NO){ 
      CGRect frame2 = controller2.view.frame; 
      frame2.origin.x = frame.origin.x; 
      controller2.view.frame = frame2; 
     }else{ 
      // [self.scrollView scrollRectToVisible:controller2.view.frame animated:YES]; 
     } 

    } completion:^(BOOL value){ 
     [controller.view removeFromSuperview]; 
     [self.views removeObject:controller]; 
     totalPages.text = [NSString stringWithFormat:@"%i", self.views.count]; 
     // currentPage.text = [NSString stringWithFormat:@"%i", 
     self.pageControl.numberOfPages = self.views.count; 
     if (lastPage && !ordersEmpty){ 
      [self.scrollView scrollRectToVisible:controller2.view.frame animated:YES]; 
      lastPageMoving = YES; 
     }else if (ordersEmpty){ 
      UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 30)]; 
      label.text = @"There are currently no notifications"; 
      label.textAlignment = UITextAlignmentCenter; 
      label.center = CGPointMake(self.scrollView.frame.size.width/2, self.scrollView.frame.size.height/3); 
      [self.scrollView addSubview:label]; 
      [label release]; 
      ofPages.text = @""; 
      totalPages.text = @""; 
      currentPage.text = @""; 
      self.scrollView.contentSize = CGSizeMake(320, 267); 
     } 

     int i = 0; 
     for (UIViewController *c in self.views) 
     { 
      c.view.frame = CGRectMake(self.scrollView.frame.size.width * i, 0, c.view.frame.size.width, c.view.frame.size.height); 
      i++; 
     } 

     if (controller2 != nil) 
     { 
      if ([controller2 isKindOfClass:[CancelledController class]]) { 
       self.acceptButton.hidden = YES; 
       [self.declineButton setTitle:@"Close" forState:UIControlStateNormal]; 
       [self.declineButton setTitle:@"Close" forState:UIControlStateHighlighted]; 
      }else{ 
       self.acceptButton.hidden = NO; 
       [self.declineButton setTitle:@"Decline" forState:UIControlStateNormal]; 
       [self.declineButton setTitle:@"Decline" forState:UIControlStateHighlighted]; 
      } 
     } 
    }]; 

的動畫很好地工作,並且當最後一個視圖被接受與EXC_BAD_ACCESS應用程序崩潰恰好在[UIView的animateWithDuration:動畫:完成]視圖中刪除被然而

解除分配方法調用。

NSZombies不準確檢測泄漏點/原因..

經過廣泛的研究,我認爲這可能是由於使用的塊..內存管理是好的,因爲如果我overreleasing什麼,NSZombies會表示它。

(代碼工作罰款模擬器雖然 - 什麼那麼無錯誤)

我做了一個視頻來演示動畫是如何工作的。它是模擬器所以沒有錯誤這裏然而,當我在一個運行設備,應用程序崩潰,只要我按下關閉按鈕。

一個有趣的事情是,如果我先關閉第二順序和後接受第一份訂單,代碼工作正常,太=(非常混亂的確.. !!

http://www.mediafire.com/?w1up9g9u6w0ucrn

該項目針對的iOS 4.0

+0

設備和模擬器分別運行5.0.1和5.1 iOS .. XCode爲4.3,Base iOS SDK爲5。1 – tGilani

+2

使用'__unsafe_unretained MyClass * weakSelf = weakSelf;'然後用weakSelf替換塊內部的'self',因爲如果在塊仍在運行時釋放self,自引用將崩潰(同樣,你不擁有)。這只是一個好習慣,不一定是你描述的錯誤。 EXC_BAD_ACCESS並不總是來自一個無效指針的消息傳遞,有時它是一個底層的C庫(不知道這是否是這種情況)。發表評論是因爲我沒有閱讀所有內容或知道問題所在。 – Jano

回答

2

您可以通過更改聲明UIViewController *controller2UIViewController *controller2 = nil;開始,那麼它是一個好主意,只使用性質,所以線:

[controller.view removeFromSuperview]; 
[self.views removeObject:controller]; 

將被替換爲調用此屬性的存取方法,如果保留或不保留ivar controller,我們將確切知道。這適用於您使用的所有其他ivars:lastPageMovingofPages,totalPages,currentPage等。 - 只需將它們更改爲屬性並確保其正確的內存管理。

+0

好..好..通過轉換所有本地變量爲控制器的實例屬性,錯誤似乎已消失..謝謝..但我真的想知道是什麼問題.. = / – tGilani

相關問題