освобожденная память в табличном представлении: сообщение отправлено освобожденному экземпляру

Я попытался найти другие проблемы, но не смог найти ничего подходящего, поэтому вот:

Я пытаюсь отобразить текст в виде таблицы, поэтому я использую этот фрагмент кода:

// 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;

Это все под cellForRowAtIndexPath

Когда я пытаюсь освободить выбранный объект Stock, я получаю эту ошибку: [Выпуск CFDictionary]: сообщение отправлено в освобожденный экземпляр 0x434d3d0

Я пытался использовать NSZombieEnabled и Build and Analyze для обнаружения проблем, но пока безуспешно. Я даже зашел так далеко, что прокомментировал фрагменты кода с помощью NSLog, но безуспешно. Ниже я опубликую код для StockData. Насколько я могу понять, что-то освобождается до того, как я сделаю выпуск, но я не уверен, как это сделать. Единственное место, где у меня есть релиз в моем коде, - это вызов метода Dealloc.

Вот код 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

person Kirn    schedule 26.05.2010    source источник


Ответы (1)


Ну, я вижу потенциальную проблему... в этом фрагменте

   (id) initWithContents: (NSString *)newName{

  if(self = [super init]){

  ticker = newName; 
  } return self;

Вы не сохраняете тикер, вы синтезируете тикер, но вам нужно назначить его, сказав self.ticker=newName или ticket=[newName keep], поэтому здесь вы не сохраняете тикер, а в Dealloc вы выпускаете тикер... так что вы перевыпускают тикер, который вызовет вашу проблему ... Также всякий раз, когда вы выпускаете этот массив, содержащий значение строки вашего тикера, если вы пытаетесь получить доступ к свойству тикера объекта, он выйдет из строя, поскольку вы его не сохранили.

person Daniel    schedule 26.05.2010
comment
Хороший улов, но я бы не рекомендовал использовать self.ticker = newName в вашем методе init. Безопаснее использовать ticker = [newName copy]. Эта практика рекомендуется, если вы каждый раз меняете метод доступа к свойству для ticker на что-то более сложное. Я найду ссылку на полный аргумент через секунду. - person e.James; 26.05.2010
comment
Эй, спасибо за быстрый ответ! Это сработало!! У меня есть один вопрос. В свойстве для тикера я установил его (неатомный, сохранить). Я думал, что это помогло бы получить значение, полученное от newName. Вы говорите, что мне нужно было сохранить объект newName, на который указывает тикер? Установка свойства для сохранения тикера не делает этого? - person Kirn; 26.05.2010
comment
Взгляните на мой ответ на другой вопрос для получения более подробной информации: title="ошибка неправильного доступа, даже если свойство установлено для сохранения"> stackoverflow.com/questions/1394360/ - person e.James; 26.05.2010
comment
Вот ссылка, которую я обещал: stackoverflow.com/questions/192721/ - person e.James; 26.05.2010
comment
когда вы объявляете свойство и синтезируете его, вы должны получить доступ к сгенерированному установщику, сказав self.propertyname, чтобы он сохранил себя... да, e.james, лучше использовать синтезированное свойство, я просто показывал альтернативы. - person Daniel; 26.05.2010
comment
@Kirn: Рад помочь! Небольшое замечание об этике сайта: поскольку Дэниел предоставил вам правильный ответ, принято голосовать за его ответ, а также помечать его как принятый. Это ни в коем случае не обязательно, но обычно так и делается. Получайте удовольствие от кодирования! :) - person e.James; 26.05.2010
comment
Я продолжаю пытаться проголосовать, но думаю, что для этого мне нужна определенная репутация (очки?). Большое спасибо, ребята. - person Kirn; 01.06.2010