2010-10-04 4 views
2
@interface Week : NSManagedObject { 

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

@end 

Je lis un fichier XML à partir du serveur et de mettre Vales au-dessus entity.Since Livres à lire pour cette semaine peuvent être multiples il est stocké dans MutableArray.I fait * livre pour être transformable dans mon fichier .xcdatamodel.Persisting NSMutableArray qui est propriété de base de données Entité

Mon analyseur ressemble à ceci qui analyse et initialise ci-dessus Entité de semaine.

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

Ce stocke bien parce que je récupérer la valeur ci-dessus de CoreData et de stocker dans NSMutableArray « weekArray » ** à afficher en ** UITableView.

Mon programme se bloque en dessous de deux fonctions et le point de basculer bascule entre moins de 2 fonctions ... étrange !!!

- (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; 
} 

* SVP dites-moi où je me trompe? Est-ce problème dans la façon dont je livre le stockage NSMutableArray dans mon analyseur ou NSManagedObject *object = (NSManagedObject *)[weekArray objectAtIndex:indexPath.row]; ligne Parce que mon NSLog n'imprime pas au-dessous ligne indexPath.row.

Mon chercher fonction est:

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

Répondre

0

On dirait qu'il pourrait être un «bug sur libération. Dans votre méthode de récupération que vous avez:

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

qui initialise le tableau « mutableFetchResults » une copie mutable du résultat de la chercher. Vous spécifiez ensuite que ce tableau doit être auto-libéré (ce qui signifie qu'il sera libéré quand cela peut être).

Vous assignez ensuite les « mutableFetchResults » à une propriété de votre classe:

self.weekArray = mutableFetchResults; 

Comme vous avez déclaré cette propriété comme « conserver », lorsque vous attribuez « mutableFetchResults » à cette propriété votre classe Conservez-le. Maintenant que quelque chose d'autre a réclamé la propriété de ce tableau en le conservant, le premier 'autorelease' est libre d'envoyer le message 'release'. À ce stade, tout va bien, car toutes vos retenues et versions sont équilibrées. Cependant, sur la ligne suivante vous relâchez explicitement à nouveau avec:

[mutableFetchResults release]; 

Cela est inutile car il aura déjà été publié par le « autorelease ». Le résultat de cette 'over-release' est que la référence affectée à 'self.weekArray' peut maintenant pointer vers un autre objet aléatoire en mémoire - ce qui pourrait bien être la raison pour laquelle votre application plante quand vous essayez d'accéder au tableau .

+0

Merci beaucoup "Jake". Mon programme fonctionne parfaitement après avoir supprimé "[mutableFetchResults release];" . Je n'aurais pas pu comprendre moi-même ce que tu as fait. – Ravi

Questions connexes