Сохранение NSMUtablearray, который является свойством Core Data Entity - PullRequest
2 голосов
/ 04 октября 2010
@interface Week : NSManagedObject { 

}
@property (nonatomic, retain) NSNumber *weekID;
@property (nonatomic, retain) NSString *top;
@property (nonatomic, retain) NSString *summary1;
@property (nonatomic, retain) NSMutableArray *book;

@end

Я читаю XML-файл с сервера и помещаю вэйлсы в вышеуказанную сущность. Так как книг для чтения за эту неделю может быть несколько, поэтому он хранится в MutableArray. Я сделал * book для преобразования в мой .xcdatamodel файл.

Мой синтаксический анализатор выглядит следующим образом: Недельная сущность .

if ([currentTag isEqualToString:@"book"]) {
   NSString *USGSWebLink = [currentElementValue1 stringByStandardizingPath] ;   
   [week.book addObject:USGSWebLink];
   [week setBook:week.book];
   NSError *error;
   if (![self.managedObjectContext save:&error]) {
    NSLog(@"%@", [error domain]);
   }

Это нормально хранится, потому что я извлекаю вышеуказанное значение из Coredata и сохраняю в NSMutableArray "weekArray" ** для отображения в ** UITableView .

Моя программа падает ниже двух функций, а точка сбоя переключается между двумя ниже функциями ... странно !!!

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    **//sometimes program crashes at this point**
     return [weekArray count]; 
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

 NSManagedObject *object = (NSManagedObject *)[weekArray objectAtIndex:indexPath.row];
    **// program crash at the above line.** 
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }

 cell.textLabel.text = [object valueForKey:@"top"];
 cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    // Set up the cell
    return cell;
}

* Пожалуйста, скажите мне, где я делаю не так? Это проблема в том, как я храню книгу NSMutableArray в моем парсере или NSManagedObject *object = (NSManagedObject *)[weekArray objectAtIndex:indexPath.row]; линия Потому что мой NSLog не печатает ниже indexPath.row line.

Моя функция выборки :

- (void)fetchRecords {   

 NSEntityDescription *entity = [NSEntityDescription entityForName:@"Week" inManagedObjectContext:appDelegate.managedObjectContext];   

 NSFetchRequest *request = [[NSFetchRequest alloc] init];  
    [request setEntity:entity];   //NSLog(@"fetchRecords = %@",appDelegate.managedObjectContext );

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"weekID" ascending:YES];  
 NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];  
    [request setSortDescriptors:sortDescriptors];  
    [sortDescriptor release];   

    NSError *error;     
 NSMutableArray *mutableFetchResults = [[[managedObjectContext executeFetchRequest:request error:&error] mutableCopy] autorelease] ;
    if (!mutableFetchResults) {  
    }   
 if (mutableFetchResults == nil) {
  NSLog(@"week fetch failed");
 } 
 self.weekArray = mutableFetchResults; NSLog(@"weekArray = %@",weekArray);
    [mutableFetchResults release];  
 [request release];  
} 

1 Ответ

0 голосов
/ 05 октября 2010

Похоже, это может быть «чрезмерная ошибка». В вашем методе выборки у вас есть:

NSMutableArray *mutableFetchResults = 
    [[[managedObjectContext executeFetchRequest:request 
                                          error:&error] mutableCopy] autorelease] ;

Инициализирует массив 'mutableFetchResults' с изменяемой копией результата выборки. Затем вы указываете, что этот массив должен быть автоматически освобожден (то есть он будет освобожден, когда это возможно).

Затем вы присваиваете 'mutableFetchResults' свойству вашего класса с помощью:

self.weekArray = mutableFetchResults;

Поскольку вы объявили это свойство как 'retain', при назначении этому свойству mutableFetchResults ваш класс сохранит его. Теперь, когда что-то еще завладело владением этим массивом, сохранив его, предыдущий «autorelease» может отправить сообщение «release». На данный момент все хорошо, так как все ваши удержания и релизы сбалансированы. Однако в следующей строке вы явно освобождаете его снова с помощью:

[mutableFetchResults release];

В этом нет необходимости, поскольку он уже был выпущен «автоматическим выпуском». Результатом этого «перевыпуска» является то, что ссылка, присвоенная «self.weekArray», теперь может указывать на какой-то другой случайный объект в памяти - что может быть причиной сбоя приложения при попытке доступа к массиву .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...