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
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. –
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
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 –