ページコントロールの最適化

iphone iphone-sdk-3.1 optimization paging scroll

私はiPhone、SDK 3.1用に開発しています。 私は彼がページスルーするために私がユーザーに表示する必要がある約150の画像を持っています。 私はAppleのPageControlサンプルからコードをコピーしましたが、iPhoneにロードすると、素早くスクロールするとアプリケーションがクラッシュします。 私はメモリを節約するために最適化を書き込もうとしましたが、それはあまり役に立ちません。 自分の最適化に改善が必要かどうか、他に問題があるかどうかを誰かに教えてもらえないかと思いました。 関連するコードは以下の通りです。

// ReviewViewController.h
@interface ReviewViewController:UIViewController {

NSMutableArray * reviewArr; NSMutableArray * viewControllers; IBOutlet UIScrollView *スクローラ。 BOOLが汚れています。 NSInteger pageCount; }

@property(保持、非原子)NSMutableArray * reviewArr; @property(保持、非原子)NSMutableArray * viewControllers; @property(代入、非原子的)UIScrollView *スクローラ;

//ReviewViewController.m

 - (void)clearScroller {NSArray * subviews = [[NSArray alloc] initWithArray:scroller.subviews]; for(UIView * subview in subviews){// NSLog(@ "DEBUG  -  view%d"、subview.tag); [subview removeFromSuperview]; [サブビューリリース]; [scroller setContentOffset:CGPointMake(0,0)アニメーション:NO]; }

-  (void)initialize:(int)page {if([reviewArr count] == 0){NSLog(@ "スタックにこれ以上カードがありません"); UILabel * label = [[UILabel割り当て] initWithFrame:CGRectMake(20、70、420、45)]; label.text = @ "スタックにレビューカードがありません"; label.numberOfLines = 2; label.font = [UIFont systemFontOfSize:20]; [scroller addSubview:label]; [レーベルリリース]; [back setHidden:YES]; [forward setHidden:YES]; [mathFactAction setHidden:YES];戻る}

NSLog(@ "初期化中..%d"、ページ);

[self setHeading]; [self clearScroller]; [mathFactAction setHidden:NO];

NSMutableArray * controllers = [[NSMutableArray alloc] init]; for(unsigned i = 0; i <reviewArr.count; i){[controllers addObject:[NSNull null]]; self.viewControllers = controllers; [コントローラリリース];

//ページはスクロールビューの幅ですscroller.pagingEnabled = YES; scroller.contentSize = CGSizeMake(scroller.frame.size.width * reviewArr.count、scroller.frame.size.height); scroller.showsHorizo​​ntalScrollIndicator = NO; scroller.showsVerticalScrollIndicator = NO; scroller.scrollsToTop = NO; scroller.delegate = self;

//ページはオンデマンドで作成されます。//表示されているページをロードします。//ユーザーがスクロールを開始したときにフラッシュが発生しないように、ページをロードします({> self loadScrollViewWithPage:page  -  1]; }

[self loadScrollViewWithPage:page]; [self loadScrollViewWithPage:1ページ目]; }

-  (void)checkForDirtyPages {(unsigned i = 0; i <[self.viewControllers count]; i){if(i == pageCount-1)を続ける;そうでなければ(i == pageCount)続ける。そうでなければ(i == pageCount 1)続ける。そうでなければunloadPage:i。 }}

-  (void)unloadPages {ダーティ= FALSE; [self unloadPage:pageCount-3]; [self unloadPage:pageCount-4]; [self unloadPage:pageCount 3]; [self unloadPage:pageCount 4]; }

-  (void)unloadPage:(int)page {if(page <0)が返される。 if(page> = reviewArr.count)が返されます。

//必要に応じてプレースホルダを置き換えますFactViewController * controller = [viewControllers objectAtIndex:page]; if((NSNull *)controller!= [NSNull null]){

/ * NSArray * subviews = [[NSArray割り当て] initWithArray:controller.view.subviews]; for(UIView * subview in subviews){// NSLog(@ "DEBUG  -  view%d"、subview.tag); [subview removeFromSuperview]; [サブビューリリース]; * / //メモリを節約するためにviewControllersからinnerscrollerを削除する[self.viewControllers replaceObjectAtIndex:page withObject:[NSNull null]]; }}

-  (void)loadScrollViewWithPage:(int)page {if(page <0)が返される。 if(page> = reviewArr.count)が返されます。

//必要に応じてプレースホルダを置き換えますFactViewController * controller = [viewControllers objectAtIndex:page]; // UIScrollView * innerScroller = [self.viewControllers objectAtIndex:page]; if((NSNull *)controller == [NSNull null]){controller = [[FactViewController alloc] initWithReviewNumber:[reviewArr objectAtIndex:page]]; [self.viewControllers replaceObjectAtIndex:page withObject:controller]; [コントローラーリリース]; }

if(nil == controller.view.superview){CGRect frame = scroller.frame; frame.origin.x = frame.size.width * page; frame.origin.y = 0; controller.view.frame = frame; [scroller addSubview:controller.view]; // [self unloadPages]; }

}

-  (void)scrollViewDidEndDecelerating:(UIScrollView *)送信者{if(ダーティ)[self unloadPages]; // [self resetScroller:pageCount-1]; // [self resetScroller:pageCount 1]; }

-  (void)scrollViewDidScroll:(UIScrollView *)sender {//ページコントロールにヒットしたユーザーから生成されたスクロールイベントが//からトリガーされる、UIPageControlとスクロールデリゲートの間の "フィードバックループ"は必要ないデリゲートメソッド ページコントロールが使用されている場合、デリゲートロジックを無効にするためにブール値を使用します。 //前後のページの50%以上が表示されているときにインジケータを切り替えるCGFloat pageWidth = scroller.frame.size.width; int page = floor((scroller.contentOffset.x  -  pageWidth / 2)/ pageWidth)1; // pageControl.currentPage = page;

//表示されているページとその両側にあるページをロードします(ユーザーがスクロールを開始したときに点滅しないようにするため)。[self loadScrollViewWithPage:page  -  1]; [self loadScrollViewWithPage:page]; [self loadScrollViewWithPage:1ページ目];

//新しいページを開いている場合if(page!= pageCount){dirty = TRUE; pageCount = page; [self setHeading]; }

//表示されなくなったView Controllerをアンロードすることで、最適化が可能になります。

-  (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning]; //スーパービューがない場合はビューを解放します//キャッシュされたデータなど、重要ではないものはすべて解放します[self checkForDirtyPages]; }

// FactViewController.m

@interface FactViewController:UIViewController {IBOutlet UIScrollView * scrollView; // IBOutlet UILabel * pageNumberLabel; NSInteger review_id; }

@property(非原子的、保持)UIView * scrollView。
//@property (nonatomic, retain) UILabel *pageNumberLabel;
@property(代入、非原子)NSInteger review_id;

 - (void)unloadImage。
-  (id)initWithReviewNumber:(NSNumber *)reviewNumber。
-  (int)getMathFactId;

@終わり

// Load the view nib and initialize the pageNumber ivar.
-  (id)initWithReviewNumber:(NSNumber *)reviewNumber {if(self = [スーパーinitWithNibName:@ "FactViewController"バンドル:nil]){self.review_id = [reviewNumber intValue];自己を返します。 }

-  (void)dealloc {// [pageNumberLabel release]; // [カードリリース]; [scrollViewリリース]; [スーパーディアロック]; }

// Set the label and background color when the view has finished loading.
-  (void)viewDidLoad {NSLog(@ "(FactVC)ビューがロードされました"); [self showImage]; [super viewDidLoad];

}

 - (void)unloadImage {[scrollViewリリース]; }

 - (void)showImage {NSNumberFormatter * numberFormatter = [[NSNumberFormatter alloc] init]; [numberFormatter setMinimumIntegerDigits:2]; NSLog(@ "読み込み中の画像(%d)"、self.review_id);

NSString * img_file = [NSString stringWithFormat:@ "%@"、[numberFormatter stringForObjectValue:[NSNumber numberWithInt:self.review_id]]]; [numberFormatterリリース];

NSString * fileLocation = [[NSBundle mainBundle] pathForResource:img_file ofType:@ "gif"]; NSData * imageData = [NSData dataWithContentsOfFile:fileLocation];

UIImage * image = [UIImage imageWithData:imageData];

// UIImage * image = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:img_file ofType:@ "gif"]]; UIImageView * imageView = [[UIImageView割り当て] initWithImage:image]; // inDirectory:@ "リソース/質問"

[scrollView addSubview:imageView]; [scrollView setContentSize:CGSizeMake(imageView.frame.size.width、imageView.frame.size.height)];

[imageViewリリース]; }

すみません、これはとても長いです、しかし、私はそれがすべてそこにあったことを確認したかったです。

  2  0


ベストアンサー

タイトルとURLをコピーしました