2010-05-26 17 views
1

J'ai essayé regardant d'autres questions, mais n'a pas pu trouver quoi que ce soit pour correspondre alors voici va:mémoire désallouée en tableview: message envoyé à l'instance désallouées

Je suis en train d'afficher du texte dans la vue de la table, donc j'utilise cette bit de code:

// StockData is an object I created and it pulls information from Yahoo APIs based on 
// a stock ticker stored in NSString *heading 

    NSArray* tickerValues = [heading componentsSeparatedByString:@" "]; 
StockData *chosenStock = [[StockData alloc] initWithContents:[tickerValues objectAtIndex:0]]; 
[chosenStock getData]; 

// Set up the cell... 
NSDictionary *tempDict = [chosenStock values]; 
NSArray *tempArr = [tempDict allValues]; 
cell.textLabel.text = [tempArr objectAtIndex:indexPath.row]; 
return cell; 

Ceci est tout sous cellForRowAtIndexPath

Lorsque je tente de libérer l'objet chosenStock si je reçois cette erreur: [communiqué CFDictionary]: message envoyé à l'instance désallouées 0x434d3d0

J'ai essayé d'utiliser NSZombieEnabled et Build and Analyze pour détecter des problèmes mais pas de chance jusqu'à maintenant. Je suis même allé jusqu'à commenter des morceaux du code avec NSLog mais pas de chance. Je posterai le code pour StockData ci-dessous. Autant que je peux comprendre quelque chose se désaffecte avant que je fasse la libération mais je ne sais pas comment. Le seul endroit que j'ai libéré dans mon code est sous l'appel de la méthode dealloc.

Voici le code StockData:

// StockData contains all stock information pulled in through Yahoo! to be displayed 

@implementation StockData 

@synthesize ticker, values; 

- (id) initWithContents: (NSString *)newName { 
    if(self = [super init]){ 
     ticker = newName; 
    } 
    return self; 
} 

- (void) getData { 

    NSURL *url = [NSURL URLWithString: [NSString stringWithFormat:@"http://download.finance.yahoo.com/d/quotes.csv?s=%@&f=%@&e=.csv", ticker, @"chgvj1"]]; 
    NSError *error; 
    NSURLResponse *response; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

    NSData *stockData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

    if(stockData) { 
     NSString *tempStr = [[NSString alloc] initWithData:stockData encoding:NSASCIIStringEncoding];  

     NSArray *receivedValuesArr = [tempStr componentsSeparatedByString:@","]; 
     [tempStr release]; 

     values = [NSDictionary dictionaryWithObjects:receivedValuesArr forKeys:[@"change, high, low, volume, market" componentsSeparatedByString:@", "]]; 
    } else { 
     NSLog(@"Connection failed: %@", error); 
    } 
} 

- (void)dealloc { 
    [ticker release]; 
    [values release]; 
    [super dealloc]; 

    NSLog(@"Release took place fine"); 
} 

@end 

Répondre

3

Eh bien je peux voir un problème potentiel ... dans cet extrait

(id) initWithContents: (NSString *)newName{ 

    if(self = [super init]){ 

    ticker = newName; 
    } return self; 

Vous ne retenez pas ticker, u syntheisze ticker, mais u besoin de Attribuez-le en disant self.ticker = newName ou ticket = [newName retain], donc vous ne retenez pas de ticker et en dealloc vous relâchez le ticker ... donc vous surchargez le ticker, ce qui provoquera votre problème ... libérer ce tableau qui maintient votre valeur de chaîne de ticker, si vous essayez d'accéder à la t icker proerty de l'objet, il va planter puisque vous ne l'avez pas retenu ..

+0

Bonne capture, mais je recommanderais de ne pas utiliser 'self.ticker = newName' dans votre méthode' init'. Il est plus sûr d'utiliser 'ticker = [newName copy]'. Cette pratique est recommandée dans le cas où vous changez tous l'accesseur de propriété pour «ticker» en quelque chose de plus complexe. Je trouverai un lien vers l'argument complet dans une seconde. –

+0

Hey merci pour la réponse rapide! Ça a marché!! J'ai une question cependant. Dans la propriété pour ticker je l'ai mis à (nonatomic, retenez). Je pensais que cela aurait fait l'affaire pour la valeur obtenue de newName. Êtes-vous en train de dire que je devais conserver l'objet newName sur lequel pointe le téléscripteur? Définir la propriété pour le téléscripteur à retenir ne fait pas cela? – Kirn

+0

Jetez un coup d'oeil à ma réponse à une autre question pour plus de détails: http://stackoverflow.com/questions/1394360/bad-access-error-even-though-property-is-set-to-retain –