2011-08-30 68 views
0

我卡住調試一個NSInvalidArgumentException。我最近的懷疑是,我沒有正確保留從plist讀取的數據,以便在訪問它時被其他物體佔據。如何正確保留從plist讀取的數據?

我的plist結構非常複雜,它有8個級別的數組/字典。當我嘗試訪問最低的對象時,我想我失去了內存。

我想知道當我讀plist文件時是否必須保留每個數據元素,還是僅僅保留頂層對象就足夠了?

這是我讀:

NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; 
NSError *error = [[[NSError alloc] init] autorelease]; 
NSArray *temp = (NSArray *)[[NSPropertyListSerialization 
          propertyListWithData:plistXML 
          options:NSPropertyListMutableContainersAndLeaves 
          format:nil 
          error:&error] retain]; 
self.dataPackage = [temp objectAtIndex:0]; 

dataPackage聲明爲:

@interface rootViewController:UIViewController{ 
    NSDictionary *dataPackage; 
} 
@property (retain) NSDictionary *dataPackage; 

合成:

@synthesize dataPackage; 

我這樣做對嗎?

感謝

利奧

+0

請提供更多關於您得到什麼異常以及它說了什麼的細節?無效的論點?哪一個?在哪一行? – progrmr

回答

2

我注意到三兩件事:

  • 你並不需要創建一個NSError對象!如果失敗,NSPropertyListSerialization將返回一個錯誤對象。 NSError *error = nil;

  • 您不必保留(自動釋放)臨時數組,你顯然不需要索引抓取對象之後整個陣列0

  • [temp objectAtIndex:0]會崩潰:只要使用init當數組爲空時!

一定要與self.dataPackage = nil釋放財產變種中的dealloc。那麼從內存管理角度來看,一切都是安全的

+0

感謝您的提示。將{self.dataPackage = nil}發佈並在一次調用中設置爲零? – leo

+0

@leo是的,沒錯 – Felix

0

請通過TextEdit中的Plist結構....更多詳情請查看我的previous post如果您使用的是Xcode 4,那麼這可能是原因。結構可能在xcode 4中發生了變化。