2011-02-23 61 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 一些跟我玩的控制器之後,我找到一個解決方案。 我每次在顯示詳細頁面時都會從文件中讀取數組,但現在這是一本字典,其中一個鍵是第一個要查找的數組,而且這個數組的陣列是我需要的結果。 陣列transer到34K和代碼,這使情況網式搜索在按鍵是:

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]]; 

這種方式是在iPhone 3G的:)當然,在模擬器好得多;-)

運作良好

回答

1

如果您保留並正確釋放您的內存,它應該無關緊要的對象初始化。只要確保您的所有房產都是retain,並且您爲每個保留的課程在dealloc中執行release致電。

2

而不是使用完全存儲在內存中的一個海量數組,我建議將國家/地區特定代碼的列表存儲在覈心數據數據庫中。

通過這樣做,您可以使用批量提取和NSFetchedResultsController來只加載您在給定時刻向用戶呈現所需的任何信息,僅此而已。這將顯着減少應用程序的整體內存使用量,並可能導致更快的啓動和加載時間。

然後,每個視圖控制器可以擁有自己的NSFetchedResultsController實例來訪問數據庫,從而對數據提供不同的視角。

+0

目前我在覈心數據,但我有我的軟件的3個版本,我想保持它們所有的主要對象模型。出於這些原因,我不想在那裏添加一個臨時數據,以避免將來增長不必要的實體。 – Alex

+0

@Alex - 您可以爲此臨時數據存儲創建一個對象模型,然後在使用'-mergedModelFromBundles:'設置Core數據堆棧時將其與公共模型合併。這會讓你擺脫你的共同模式,但讓你在這裏使用它。 –