интересное поведение источника данных UITableView - PullRequest
1 голос
/ 27 августа 2010

Итак, у меня есть очень простой контроллер ipad view, и я проводил тестирование с несколькими UITableViews в одном представлении.Проблема, с которой я столкнулся, заключалась в том, что когда я выбирал строку, она выкидывала EXC_BAD_ACCESS, поэтому я включил ведение журнала стека и обнаружил следующее:

*** -[VCTables tableView:didSelectRowAtIndexPath:]: message sent to deallocated instance 0x4c0ad40

Затем я начал смотреть на свой код и не мог найтижизнь меня, что вызывает это.У меня есть UITableViewDataSource и UITableViewDelegate на моем контроллере представления, и у меня есть весь соответствующий код, чтобы обработать, выбрал строку по индексу.Он правильно рисует таблицы, он просто не использует себя как источник данных.

Я попытался создать UITableViews в коде, а также в Интерфейсном конструкторе.Я повторно загрузил и установил XCode 3.2.3 SDK 4.0.2 после его удаления и перезапуска.Я не мог на всю жизнь понять, чего мне не хватает, но после предыдущего я теперь убежден (я полагаю), что это проблема кода, а не IDE, я просто не могу открыть глаза достаточно широко, чтобы увидетьпроблема кода.

Кроме того, это происходит только с одной таблицей.И с 2 таблицами, это происходит независимо от того, какую таблицу я выбираю

, вот некоторый код:

VCTables.h

#import <UIKit/UIKit.h>
@interface VCTables : UIViewController<UITableViewDelegate,UITableViewDataSource> {
    UITableView *table1;
    UITableView *table2;    
}
@end

VCTables.m

#import "VCTables.h"
@implementation VCTables
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 50;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 7;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *CellIdentifier = [[NSString alloc] initWithString:@"yourCell"];
    if(tableView.tag == 2000){
        [CellIdentifier release];
        CellIdentifier = [[NSString alloc] initWithString:@"myCell"];
    }
    UITableViewCell *cell = (UITableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    if(tableView.tag == 2000){
        [cell.textLabel setText:[NSString stringWithFormat:@"%d",indexPath.row]];
    }else{
        [cell.textLabel setText:[NSString stringWithFormat:@"%d%d",indexPath.row,indexPath.section]];
    }
    [CellIdentifier release];   
    return cell;
}
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    return NO;
}
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    return NO;
}
-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
    NSLog(@"selected"); 
}
- (void)viewDidLoad {
    [super viewDidLoad];
    table1 = [[UITableView alloc] initWithFrame:CGRectMake(20, 73, 320, 480) style:UITableViewStylePlain];
    table1.delegate=self;
    table1.dataSource=self;
    table1.tag=2000;
    [self.view addSubview:table1];
    table2 = [[UITableView alloc] initWithFrame:CGRectMake(483, 73, 320, 480) style:UITableViewStylePlain];
    table2.delegate=self;
    table2.dataSource=self;
    table2.tag=2000;
    [self.view addSubview:table2];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
- (void)viewDidUnload {
    [super viewDidUnload];
}
- (void)dealloc {
    [super dealloc];
}
@end

Я не уверен, что это становится более простым, чем это.Пожалуйста, скажите мне ошибку новичка, которая настолько болезненно очевидна, что я должен прекратить публиковать здесь.Заранее спасибо

1 Ответ

3 голосов
/ 27 августа 2010

сообщение отправлено на освобожденный экземпляр 0x4c0ad40

Эта ошибка означает, что ваш экземпляр VCTables был выпущен. UITableView по-прежнему имеет ссылку на него (свойство делегата), поэтому он пытается отправить сообщение освобожденному объекту. Общий термин для этого - зомби.

Для отладки вы должны посмотреть, как осуществляется управление памятью для вашего объекта VCTables. Где он создан и кому он принадлежит?

Если вы можете использовать инструменты производительности Apple, попробуйте использовать инструмент зомби, чтобы узнать, где этот объект VCTables выпущен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...