在iPhone中使用plist时出现应用程序崩溃问题

时间:2010-09-08 17:11:05

标签: iphone plist

我使用过NSMutable Dictionary和NSMutable Array。使用NSMrray of NSMutable Dictionary从plist(文档目录)存储和检索数据。

编辑:

滚动视图中有六个按钮,单击按钮,数据将使用XML解析显示在表视图中。我已将数据放入plist并从plist中检索并显示在表视图中。在表格视图中,我有一个按钮作为页脚视图。单击该按钮,将在表视图中解析并显示下一个项目。下一个解析内容将添加到先前的内容中。我使用NSMutable Dictionary将数据存储到plsit中。

我的代码在这里,

返回数组返回解析细节和。

  -(void)callFromSecondaryThread:(NSMutableArray *)returnArray{

     if([returnArray count] > 0)
     {
         for(NSMutableArray *arr in returnArray)
         {
             //[copyArray addObjectsFromArray:returnArray];  
             //[copyArray addObject:returnArray];   
             //[ ???? ??? ??????? ?????? ] 
         } 
               [self.table reloadData];
     }

//首次将内容保存在plist中并从plist中加载内容并显示在表视图中

 -(void)startParsingBasedOnSelectedTabValue:(NSString *)strValue {//button value

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    if (![self checkFileIsThere:tagString]) { //checks the plist is available or not, if its not available, then create a new file. i have created separate plist file for each buttons.

    if([copyArray count] > 0)
    {
        [copyArray removeAllObjects];
    }

    feedDictionary = [[NSMutableDictionary alloc]init];

    //send url for parsing [self parsingMethod];

    [feedDictionary setObject:copyArray forKey:tagString];

    [feedDictionary writeToFile:[self saveFilePath:tagString] atomically:NO];

    [feedDictionary release];

    } else{

             NSString *stringPtah = [self saveFilePath:tagString];

             NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:stringPtah];

             NSMutableArray *arrArray = [dictionary objectForKey: tagString];

             copyArray = [arrArray copy];
                   }  
            [self.table performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
            [pool drain];
       }


     //On clicks the next 10 details button, 

 -(void) details:(NSString *) strpageCount
 {

    if ([self checkFileIsThere:tagString]) {

    [[NSFileManager defaultManager]  removeItemAtPath:[self saveFilePath:tagString] error:NULL];  // remove the old plist here

     NSMutableDictionary *feedDictionary1 = [[NSMutableDictionary alloc]init];

     [self parsingMehods];

     [feedDictionary1 setValue:copyArray forKey:tagString];

     [feedDictionary1 writeToFile:[self saveFilePath:tagString] atomically:NO];

     [pageDictionary setValue:pString forKey:tagString];

     [feedDictionary1 release];

     [self.table reloadData]; // After writing the file in the plist, i just reload the table data and displayed the contents in the table view. 

    }
 }

但我有时只能在copyArray中成功添加数据。这意味着,我在加载视图后点击了下一个按钮,它工作正常。但是,如果我移动下一个按钮并访问该视图并返回第一个视图并单击下一个按钮,我的应用程序崩溃了。

我可以在returnArray中获取数据,copyArray是我的主数组,它用于显示内容(CellforRowatindex).ReturnArray是一个可变数组,它包含标题,日期,图像等,

点击(下一个10个细节)按钮,我删除了我的旧plist并创建了一个包含新内容的新plist。(例如:第一个plist在复制数组中有10个内容并返回4个新内容。它会在副本数组中添加14个内容并显示在表视图中)。在第一次加载我的应用程序时,单击下一步按钮,将成功添加该数组。但我访问剩余的按钮和详细信息,然后回到视图,然后单击下一个按钮,我的应用程序崩溃并获得此异常,

     Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray removeObjectAtIndex:]: mutating method sent to immutable object' 

我花了很多时间来解决这个问题,直到找不到解决方案。

请在我的代码中提到我做错了什么..

请指导我?

谢谢!

1 个答案:

答案 0 :(得分:1)

copyArray = [arrArray copy];行应为copyArray = [arrArray mutableCopy];。您收到错误是因为copyArray是不可变的。