Ошибка EXC_BAD_ACCES при перезагрузке содержимого tableview

#objective-c #ios #xcode #uitableview

#objective-c #iOS #xcode #uitableview

Вопрос:

После правильного заполнения массива, когда я вызываю его снова с помощью tableview reload, в первый раз (после очистки) возвращается пустое значение, а после выполнения возвращается EXC_BAD_ACCES . Пытаюсь предоставить весь необходимый код… Спасибо за помощь!

в файле .h:

     @interface userViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {

        NSArray *appData;

        IBOutlet UIActivityIndicatorView *activityIndicator;
        IBOutlet UILabel *status;
        IBOutlet UITableView *mainTable;
        IBOutlet UIBarButtonItem *refresh; 
    }

    @property (nonatomic, retain) UIActivityIndicatorView *activityIndicator;
    @property (nonatomic, retain) UILabel *status;
    @property (nonatomic, retain) UITableView *mainTable;
    @property (nonatomic, retain) UIBarButtonItem *refresh;
    @property (nonatomic, retain) NSArray *appData;

- (IBAction) refresca: (id)sender;
  

в файле .m при выполнении функции requestFinished AppData заполняется правильно.

 - (void)requestFinished:(ASIHTTPRequest *)request {
    NSLog(@"%@", [request responseString]);
    [activityIndicator stopAnimating];
    activityIndicator.hidden = YES;

    appData = [[request responseString] componentsSeparatedByString: @"#"]; 

    int x =0;

    while (x<[appData count] - 1)
    {
        NSLog(@"Data = %@",[appData objectAtIndex: x]);
        x = x 1;
    }

}
  

Однако после его выполнения при перезагрузке tableview AppData кажется пустым, а предыдущее содержимое удалено!!

 2011-10-13 18:10:43.682 Nimbo[444:207] Data = <UITableViewCellContentView: 0x5c93dd0; frame = (0 0; 320 43); layer = <CALayer: 0x5c953b0>

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

        [tableView setFrame:CGRectMake(0, 44, 320, 412)];

        static NSString* cellIdentifier = @"cellIdentifier";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

        if(cell == nil)
        {
            cell = (UITableViewCell*) [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];

        }
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.textLabel.backgroundColor = [UIColor clearColor];


        int x = 0;

        if ([appData count] != 0)
           {
           NSLog(@"Data = %@",[appData objectAtIndex: 0]);
            }

        return cell;
    }
  

Ответ №1:

Похоже, ваша переменная экземпляра appData не сохраняется.

РЕДАКТИРОВАТЬ: как уже говорили другие, использование свойства — лучший способ. Это сохранит ваши новые appData , а также объекты выпуска, ранее назначенные там.

Попробуйте изменить:

     appData = [[request responseString] componentsSeparatedByString: @"#"]; 
  

Для:

     self.appData = [[request responseString] componentsSeparatedByString: @"#"]; 
  

Ответ №2:

Ваша проблема в основном заключается здесь

 appData = [[request responseString] componentsSeparatedByString: @"#"];
  

Вы назначаете автоматически освобожденный объект appData , который не является правильным способом, поскольку вы не являетесь владельцем. Вы также не освобождаете права собственности на ранее сохраненные данные. Вы должны использовать метод setter из appData .

 self.appData = [[request responseString] componentsSeparatedByString: @"#"];
  

это должно быть исправлено.

Ответ №3:

Вы должны использовать свойство ( self.appData ):

 self.appData = [[request responseString] componentsSeparatedByString: @"#"];
  

Ответ №4:

Не знаю, проблема это или нет, скорее всего, нет… Но зачем определять свойство, если вы не используете self.AppData? Вы @synthesize AppData?

Когда вы используете свойства, вызов self.property фактически вызывает сгенерированные установщик и получатель, и они работают так, как указано в свойстве. Итак, если вы укажете свойство с помощью retain , но присвоите самой переменной возвращаемый массив удобства, после цикла событий массив удобства будет автоматически выпущен, и поскольку вы не сохранили массив, он будет удален из памяти, потеряв все, что у вас там было, и что, вероятно, происходит вваш случай.