2010-09-24 2 views
0

У меня проблема с утечкой в ​​моем приложении.NSMutbleArray - добавить/удалить объекты со свойствами - утечки

Я пытаюсь добавить и удалить объекты в NSMutableArray.

Вот класс Demande:

@interface Demande : NSObject { 
//attibuts de la classe demande 
NSString *demId; 
NSString *demStatut; 
NSString *demTitle; 
NSString *demCreated; 
NSString *demIdCopro; 
NSString *demIdImmeuble; 
NSString *demIdLot; 
NSString *demDescriptif; 
NSString *demAuteur; 
NSString *demIdAuteur; 
NSString *demLoginAuteur; 
} 
@property (retain,nonatomic) NSString *demId; 
@property (retain,nonatomic) NSString *demIdCopro; 
@property (retain,nonatomic) NSString *demIdImmeuble;  
@property (retain,nonatomic) NSString *demIdLot; 
@property (retain,nonatomic) NSString *demDescriptif; 
@property (retain,nonatomic) NSString *demStatut; 
@property (retain,nonatomic) NSString *demTitle; 
@property (retain,nonatomic) NSString *demCreated; 
@property (retain,nonatomic) NSString *demAuteur; 
@property (retain,nonatomic) NSString *demIdAuteur; 
@property (retain,nonatomic) NSString *demLoginAuteur; 
@end 


#import "Demande.h" 
@implementation Demande 

@synthesize demId,demIdCopro,demIdImmeuble,demIdLot,demDescriptif,demStatut,demTitle,demCreated,demAuteur,demIdAuteur,demLoginAuteur; 

- (void)dealloc { 

[demId release]; 
[demIdCopro release]; 
[demId release]; 
[demIdImmeuble release]; 
[demIdLot release]; 
[demDescriptif release]; 
[demStatut release]; 
[demTitle release]; 
[demCreated release]; 
[demAuteur release]; 
[demIdAuteur release]; 
[demLoginAuteur release];  
[super dealloc]; 

} 
@end 

Что я пытаюсь сделать в MyTableViewController:

@interface MyTableViewController : UITableViewController { 

IBOutlet UITableView *tableV; 
NSMutableArray *tab_Demandes; 
} 
@end 

@implementation MyTableViewController 

- (void)requestDReloadDone:(ASIHTTPRequest *)request 
{ 

NSData *responseData = [request responseData]; 

NSString *jsonString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
//NSLog(@"JSON: %@",jsonString); 

NSDictionary *results = [jsonString JSONValue]; 

NSArray *demandes = [results objectForKey:@"Demandes"]; 

    [tab_Demandes removeAllObjects]; // -------- CRASH HERE !!!, except the first time through the method because the array is empty 

    for (NSDictionary *demandeD in demandes) 
{ 

    //parse du JSON 
    NSString *titre = [demandeD objectForKey:@"Title"]; 
    NSString *desriptif = [demandeD objectForKey:@"Description"]; 
    NSString *Id = [demandeD objectForKey:@"Id"]; 
    NSString *created = [demandeD objectForKey:@"Created"]; 
    NSString *statut = [demandeD objectForKey:@"Statut"]; 
    NSString *copropriete = [demandeD objectForKey:@"Copropriete"]; 
    NSString *immeuble = [demandeD objectForKey:@"Immeuble"]; 
    NSString *lot = [demandeD objectForKey:@"Lot"]; 
    NSString *auteur = [demandeD objectForKey:@"Author"]; 
    NSString *auteurId = [demandeD objectForKey:@"IdAuthor"]; 
    NSString *auteurLogin = [demandeD objectForKey:@"Login"]; 

    //Creation de l'objet 
    Demande *dem =[[Demande alloc] init];  
    dem.demTitle=titre; 
    dem.demId=Id; 
    dem.demCreated=created; 

    NSString *descriptifDecode = [desriptif stringByReplacingPercentEscapesUsingEncoding: 
            NSASCIIStringEncoding];  

    dem.demDescriptif=descriptifDecode; 
    dem.demIdCopro=copropriete; 
    dem.demIdImmeuble=immeuble; 
    dem.demIdLot=lot; 
    dem.demStatut=statut; 
    dem.demAuteur=auteur; 
    dem.demIdAuteur=auteurId; 
    dem.demLoginAuteur=auteurLogin; 

    [tab_Demandes addObject:dem]; 

    [dem release]; 
} 

[tableV reloadData]; 

[jsonString release]; 
} 

На первом запуске приложения мой tab_Demandes массив пуст, так все нормально [removeAllObjects ] работает, поскольку в нем нет объектов. Когда я перезаряжаю tab_Demandes, мне нужно его очистить. Это когда приложение падает

я понял, что если я делаю:

- (void)dealloc { 
    /* 
[demId release]; 
[demIdCopro release]; 
[demId release]; 
[demIdImmeuble release]; 
[demIdLot release]; 
[demDescriptif release]; 
[demStatut release]; 
[demTitle release]; 
[demCreated release]; 
[demAuteur release]; 
[demIdAuteur release]; 
[demLoginAuteur release]; 
    */ 
[super dealloc]; 
} 

в классе Demande я тогда можно сделать

[tab_Demandes removeAllObjects] 

в TableViewController.

Но тогда у меня есть свойства, просочившиеся для каждого объекта Demande. Это похоже на то, что когда я делаю [dem release], свойства также сохраняются, и когда я хочу сделать [removeAllObjects] из моего tab_Demandes, нет никаких свойств для выпуска, и я получаю Bad_Access.

Если у кого есть идея ...

EDIT: метод cellForROw:

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

static NSString *CellIdentifier = @"Cell";  
CustomCellViewController *cell = (CustomCellViewController *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) 
{ 
    // NSLog(@"Cell created"); 
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCellViewController" owner:nil options:nil]; 

    for(id currentObject in topLevelObjects) 
    { 
     if([currentObject isKindOfClass:[CustomCellViewController class]]) 
     { 
      cell = (CustomCellViewController *)currentObject; 
      break; 
     } 
    } 
} 

    // Set up the cell... 

    cell.lbl_demId.text=[NSString stringWithFormat:@"%@", [[tab_Demandes objectAtIndex:indexPath.row ] demId]]; 
    cell.lbl_demCopro .text=[NSString stringWithFormat:@"%@", [[tab_Demandes objectAtIndex:indexPath.row] demIdCopro ]]; 
    cell.lbl_demImmeuble.text=[NSString stringWithFormat:@"%@", [[tab_Demandes objectAtIndex:indexPath.row] demIdImmeuble]]; 
    cell.lbl_demLot.text=[NSString stringWithFormat:@"%@", [[tab_Demandes objectAtIndex:indexPath.row] demIdLot]]; 
    cell.lbl_demDescriptif.text=[NSString stringWithFormat:@"%@", [[tab_Demandes objectAtIndex:indexPath.row] demTitle]]; 
    if ([[[tab_Demandes objectAtIndex:indexPath.row] demStatut] isEqualToString: @"Validée"]) 
    { 
    cell.lbl_ImageView.image=[UIImage imageNamed:@"VDEM2.png"]; 
    } 
    if([[[tab_Demandes objectAtIndex:indexPath.row] demStatut] isEqualToString: @"Initiée"]) 
    { 
     cell.lbl_ImageView.image=[UIImage imageNamed:@"IDEM.png"]; 
    } 
    if([[[tab_Demandes objectAtIndex:indexPath.row] demStatut] isEqualToString: @"Terminée"]) 
    { 
    cell.lbl_ImageView.image=[UIImage imageNamed:@"TDEM.png"]; 
    } 
    if([[[tab_Demandes objectAtIndex:indexPath.row] demStatut] isEqualToString: @"En coursée"]) 
    { 
    cell.lbl_ImageView.image=[UIImage imageNamed:@"EDEM.png"]; 

    } 

return cell;  
} 
+0

Вы когда-нибудь пробовали неатомическими, сохраняет вместо сохранения, неатомические. Я знаю, это звучит глупо, но на всякий случай ... – VdesmedT

+0

hey VdesmedT ;-). Я старался неатомически, сохранял, ничего не менял. Нужно ли освобождать объекты dem сразу после добавления их в tab_Demandes? это правильный способ? Являются ли свойства объектов выпущенными при выпуске объекта? – wallou

+0

tab_Demandes имеет указатели на объекты dem. если я делаю dem release, возможно, если свойства будут выпущены, когда я попытаюсь удалить removeAllObjects, возможно, указатели все еще ссылаются на уже выпущенные свойства? – wallou

ответ

0

Где tab_Demandes быть intialized?

Недостаточно только объявить его в файле .h, вы также должны сообщить компилятору о необходимости его выделения и инициализировать.

Простое исправления может быть замена линии [tab_Demandes removeAllObjects]; с

if(!tab_Demandes) { // tab_Demandes is nil and has not previously been created 
    tab_Demandes = [[NSMutableArray arrayWithCapacity:10] retain]; 
} else { 
    [tab_Demandes removeAllObjects]; 
} 

Не забудьте [tab_Demandes release] в вашем dealloc методы

Смежные вопросы