2011-02-23 10 views
0

私は小さな配列ではないAppDelegateから読んでいます。ビュー間でnsarray(3.1Mサイズ)を共有する正しい方法

NSArray *mycountryspecific = [[NSArray alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"nextTwoWeekEvents" withExtension:@"ary"]]; 
self.myCountrySpecificCodesList = mycountryspecific; 
[mycountryspecific release],mycountryspecific = nil; 

メモリでそれを保つために、私は、プロパティ

@property (nonatomic, retain) NSArray *myCountrySpecificCodesList; 

を宣言した。しかし、メインビューから私はイベント詳細ビューコントローラ場所を持つことになりますイベントコントローラの下で、それを使用しますながら2つの段階に行かなければなりませんこの配列の必須部分(述語に基づく)になります。

私の現在のデザインは、AppDelegateではなく、必要に応じてイベント詳細ビューコントローラからの読み取り配列です。

あなたは経験を共有できますか? appdelegateからロード配列を読み込み、メモリに保持する方が良い場合は、メモリリークのないクラス間でアクセスプロパティを送信する正しい方法をアドバイスしてください。

EventsTableViewController *events = [[EventsTableViewController alloc] initWithNibName:@"EventsTableViewController" bundle:nil]; 
self.eventListController = events; 

PromoView *promo = [[PromoView alloc] initWithNibName:@"PromoView" bundle:nil]; 

UINavigationController *navigationController = [[UINavigationController alloc] init]; 
[navigationController pushViewController:events animated:NO]; 

UITabBarController *tabBar = [[UITabBarController alloc] init]; 
self.tabBarController = tabBar; 

[tabBar setViewControllers:[NSArray arrayWithObjects:navigationController,promo,nil]]; 

eventListController.managedObjectContext = self.managedObjectContext; 

[self.window addSubview:tabBarController.view]; 

SOLUTION 私のコントローラとのいくつかの演奏の後、私は解決策を見つけることでした。 詳細なページを表示するたびに、ファイルから配列を読み込みますが、今はこれが辞書です。ここでキーは最初に見つかった配列であり、この配列の配列は必要な結果です。 配列は、34Kにトランサーだったとキーケースの集中検索を行うコードは、次のとおりです。この方法では

;-)エミュレータ上ではるかに優れた、iPhoneの3Gに:)もちろんうまく機能している

NSDictionary *mycountryspecific = [[NSDictionary alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"countryspecific" withExtension:@"dict"]]; 
NSSet * mySet = [mycountryspecific keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) { 
    if([key compare:countryName options:NSCaseInsensitiveSearch] == NSOrderedSame) { 
     return YES; 
    } 
     else 
     return NO; 
    }]; 

NSArray *result = [mycountryspecific valueForKey:[mySet anyObject]]; 

答えて

1

メモリを適切に保持してリリースする場合は、オブジェクトの初期化先は関係ありません。すべてのプロパティがretainであることを確認し、保持するクラスごとにdeallocreleaseコールを適用します。

2

メモリに保存されている1つの大規模配列を使用するのではなく、国別コードのリストをコアデータデータベースに保存することをお勧めします。

これにより、バッチフェッチとNSFetchedResultsControllerを使用して、その瞬間にユーザに提示する必要のある情報だけをロードすることができます。これにより、アプリケーションの全体的なメモリ使用量が大幅に削減され、起動時間と読み込み時間が向上します。

各ビューコントローラは、データベースにアクセスするための独自のNSFetchedResultsControllerインスタンスを持つことができ、データに異なる視点を提供します。

+0

現在、私はコアデータを持っていますが、私は3つのバージョンのソフトウェアを持っています。これらの理由から、私は一時的なデータを追加して、将来的に不要なエンティティを増やすことを避けたいと考えています。 – Alex

+0

@Alex - '-mergedModelFromBundles:'を使ってコアデータスタックを設定するときに、この一時的なデータストアだけのオブジェクトモデルを作成し、それを共通モデルとマージすることができます。それはあなたの共通のモデルからこれを保つでしょう、しかしあなたはここでそれを使用させます。 –

関連する問題