2011-02-07 8 views
0

最後までスクロールしてページをめくって戻ってくることがあるため、最初は奇妙なUIScrollビューがありますクライアントはそれを望んでいた。なんらかの理由で時々クラッシュし(実際のiPadでより頻繁に)、クラッシュログなしでこれが実行されます。私は記憶に関連しなければならないと感じています。これがクラッシュするのを防ぐ方法はありますか?ありがとう。ページが反転する大規模なUIScrollViewがクラッシュすることがある

#import "viewBookVC.h" 
#import "switchVC.h" 
#import "switchExVC.h" 
#import "mainMenuAppDelegate.h" 
#import "exGlobal.h" 

@implementation ViewBookVC 

UIScrollView *scroll; 

UIButton *prevPageButton; 
UIButton *nextPageButton; 

UIImage *scrollImage; 

UIImageView *BGview2; 

NSMutableArray *BGList; 

NSMutableArray *pagingEnabledArr; 

int currentPage = 0; 

int maxPages = 0; 

// used to put a delay on the previous page touch detection 
int prevNextPageDetectDelay = 45; 

int prevNextPageDetectDelayCounter = 0; 

int nextContentOffsetX; 



- (id)initWithFrame:(CGRect)frame { 

    self = [super initWithFrame:frame]; 
    if (self) { 

     currentPage = 0; 

     maxPages = 0; 

     prevNextPageDetectDelayCounter = 0; 

     mainMenuAppDelegate *del = (mainMenuAppDelegate *)[[UIApplication sharedApplication] delegate]; 

     // page list 
     BGList = [[NSMutableArray alloc] init]; 

     for(int i = 0; i < 31; i++) { 
      NSString *img = [NSString stringWithFormat:@"Viewbook_%d.png", i]; 
      [BGList addObject:img]; 
     } 


     maxPages = [BGList count]; 


     // scrolling rules for paging being enabled 

     pagingEnabledArr = [[NSMutableArray alloc] init]; 
     [pagingEnabledArr addObject:@"YES"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"YES"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"YES"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"YES"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"YES"]; 
     [pagingEnabledArr addObject:@"YES"]; 


     timer_checkScrollPos = [[NSTimer scheduledTimerWithTimeInterval:.005 
                   target:self 
                   selector:@selector(onTimer_checkScrollPos:) 
                   userInfo:nil 
                   repeats:YES] retain]; 

     ///////////// 
     //   // 
     // SCROLL // 
     //   // 
     ///////////// 

     //scroll view 
     CGRect scrollContainer = CGRectMake(0, 0, 1024, 768); 
     scroll = [[UIScrollView alloc] initWithFrame:scrollContainer]; 
     [scroll setBackgroundColor:[UIColor blackColor]]; 
     scroll.contentSize = CGSizeMake(1024, 722); 

     scroll.showsHorizontalScrollIndicator = YES; 
     scroll.bounces = NO; 

     scroll.pagingEnabled = YES; 

     [self addSubview:scroll]; 

     // get scroll offset 
     NSLog(@"cOffset(A): %f", scroll.contentOffset.x); 


     //image to use in scroll 
     scrollImage = [UIImage imageNamed:@"Viewbook_0.png"]; 
     BGview2 = [[UIImageView alloc] initWithImage:(UIImage *)scrollImage]; 
     BGview2.frame = CGRectMake(0, 23, 1024, 722); 


     [scroll addSubview:BGview2]; 


     //back button [prev button height was compensated for this button to work] 

     CGRect backBTNFrame = CGRectMake(10, 30, 140, 52); 
     UIButton * viewbook_backButton = [[UIButton alloc] init]; 
     viewbook_backButton.frame = backBTNFrame; 
     UIImage *viewbook_backButtonIMG = [UIImage imageNamed:@"SHIP_button_back.png"]; 
     [viewbook_backButton setImage:viewbook_backButtonIMG forState:UIControlStateNormal]; 
     viewbook_backButton.backgroundColor = [UIColor clearColor]; 
     [self addSubview:viewbook_backButton]; 

     [viewbook_backButton addTarget:self 
           action:@selector(kill_timers) 
         forControlEvents:UIControlEventTouchUpInside];  

     [viewbook_backButton addTarget:del.switchVC 
           action:@selector(gotoMain) 
         forControlEvents:UIControlEventTouchUpInside];  


     [viewbook_backButton release]; 





     //prev button 
     CGRect prevPageButtonFrame = CGRectMake(0, 70, 312, 698); 
     prevPageButton = [[UIButton alloc] init]; 
     prevPageButton.frame = prevPageButtonFrame; 
     prevPageButton.backgroundColor = [UIColor clearColor]; 
     [self addSubview:prevPageButton]; 

     [prevPageButton addTarget:self 
          action:@selector(prevPage:) 
       forControlEvents:UIControlEventTouchUpInside]; 


     //next button 
     CGRect nextPageButtonFrame = CGRectMake(712, 0, 312, 768); 
     nextPageButton = [[UIButton alloc] init]; 
     nextPageButton.frame = nextPageButtonFrame; 
     nextPageButton.backgroundColor = [UIColor clearColor]; 
     [self addSubview:nextPageButton]; 

     [nextPageButton addTarget:self 
          action:@selector(nextPage:) 
       forControlEvents:UIControlEventTouchUpInside]; 



    } 
    return self; 
} 


-(void) onTimer_checkScrollPos:(NSTimer*)timer { 

    if(currentPage!=0){ 
     nextContentOffsetX = 750; 
    }else{ 
     nextContentOffsetX = 0; 
    } 

    //NSLog(@"cOffset(A): %f", scroll.contentOffset.x); 
    if(scroll.contentOffset.x >= nextContentOffsetX){ 
     nextPageButton.hidden = NO; 
    }else{ 
     nextPageButton.hidden = YES; 
    } 

    if(scroll.contentOffset.x <= 274){ 
     prevPageButton.hidden = NO; 
    }else{ 
     prevPageButton.hidden = YES; 
    } 

    prevNextPageDetectDelayCounter += 1; 
} 


- (void)nextPage:(id)sender { 

    if(currentPage!=0){ 
     nextContentOffsetX = 750; 
    }else{ 
     nextContentOffsetX = 0; 
    } 

    if(scroll.contentOffset.x >= nextContentOffsetX & prevNextPageDetectDelayCounter>=prevNextPageDetectDelay){ 

     prevNextPageDetectDelayCounter = 0; 

     currentPage+=1; 

     if(currentPage >= maxPages){ 
      currentPage = 0; 
     } 

     if(currentPage!=0){ 
      scroll.contentSize = CGSizeMake(2048, 722); 
      BGview2.frame = CGRectMake(0, 23, 2048, 722); 
     }else{ 
      scroll.contentSize = CGSizeMake(1024, 722); 
      BGview2.frame = CGRectMake(0, 23, 1024, 722);   
     } 

     [UIView beginAnimations:@"flipping view" context:nil]; 
     [UIView setAnimationDuration:0.8]; 
     [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
     [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp 
           forView:scroll 
           cache:YES]; 
     [scroll setHidden:NO]; 
     [UIView commitAnimations]; 

     if([pagingEnabledArr objectAtIndex:currentPage][email protected]"YES"){ 
      scroll.pagingEnabled = YES; 
     }else{ 
      scroll.pagingEnabled = NO; 
     } 


     BGview2.image = [UIImage imageNamed:[BGList objectAtIndex:currentPage]]; 

     // set scroll offset 
     [scroll setContentOffset:CGPointMake(0,0) animated:NO]; 

    } 
} 

- (void)prevPage:(id)sender { 
    if(scroll.contentOffset.x <= 274 & prevNextPageDetectDelayCounter>=prevNextPageDetectDelay){ 

     prevNextPageDetectDelayCounter = 0; 

     currentPage-=1; 

     if(currentPage < 0){ 
      currentPage = maxPages-1; 
     } 

     if(currentPage!=0){ 
      scroll.contentSize = CGSizeMake(2048, 722); 
      BGview2.frame = CGRectMake(0, 23, 2048, 722); 
     }else{ 
      scroll.contentSize = CGSizeMake(1024, 722); 
      BGview2.frame = CGRectMake(0, 23, 1024, 722);   
     } 

     [UIView beginAnimations:@"flipping view" context:nil]; 
     [UIView setAnimationDuration:0.8]; 
     [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
     [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown 
           forView:scroll 
           cache:YES]; 
     [scroll setHidden:NO]; 
     [UIView commitAnimations]; 

     if([pagingEnabledArr objectAtIndex:currentPage][email protected]"YES"){ 
      scroll.pagingEnabled = YES; 
     }else{ 
      scroll.pagingEnabled = NO; 
     } 

     BGview2.image = [UIImage imageNamed:[BGList objectAtIndex:currentPage]]; 

     // set scroll offset 
     [scroll setContentOffset:CGPointMake(0,0) animated:NO]; 

    } 
} 

-(void) kill_timers{ 
    NSLog(@"kill viewbook timer"); 

    [timer_checkScrollPos invalidate]; 
    timer_checkScrollPos = nil; 

} 

- (void)dealloc { 

    [scroll release]; 

    [BGview2 release]; 

    [BGList release]; 

    [pagingEnabledArr release]; 

    [prevPageButton release]; 
    [nextPageButton release]; 

    [timer_checkScrollPos invalidate]; 
    [timer_checkScrollPos release]; 

    [super dealloc]; 
} 

@end 

答えて

0

これはメモリ管理の問題のようです。私は一度に1ページまたは2ページしか表示しないものの、すべてのコンテンツをメモリにロードしていると思われます。コアデータまたはXMLを使用して、常に必要なデータのみをロードすることをお勧めします。

デバイスがシミュレータより安定していない限り、シミュレータはではなく、エミュレータであるであることに注意してください。シミュレータはあなたのMacのメモリを使用し、あなたのiPadのメモリの制限はありません。

  • は、お使いのMacにアプリをフックしてみて、コンソール(CMD + Shiftキー+ R)を見て:

    あなたはいくつかのオプションがあり、これをデバッグします。あなたのアプリがメモリ警告を受け取ると警告が表示されます。レベル1にはしばしばレベル2が続き、しばしばクラッシュが続きます。これは、既存の問題の存在を実証するのに役立ちます。

  • 割り振りツールを使用してアプリを実行すると、何が原因でメモリが非常に多く割り当てられる可能性があるのか​​を把握できます。 Leaks楽器は、メモリリークを見つけるのに役立ちます。

  • 「ビルドと分析」というXcodeの素晴らしい機能を活用してください。メモリリークを見つけるのはかなり良いです。 (ビルド - >ビルドと分析)

システムが提供する必要のないメモリのリークとメモリの割り当ての間に、クラッシュする可能性があります。

関連する問題