2010-08-27 4 views
1

Итак, у меня есть этот очень простой контроллер представления ipad, и я делал некоторые тесты с несколькими UITableViews в одном представлении. Вопрос у меня был, когда я выбрал строку, было бы бросить EXC_BAD_ACCESS поэтому я включил протоколирование стеки и нашел этоинтересное поведение источника данных UITableView

*** -[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 

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

+0

попытайтесь сохранить свои столы при их создании - normall EXC_BAD_ACCESS означает, что что-то освобождает себя/забывается до того момента, когда вы его используете. :) Вам также нужно помнить о том, чтобы выпустить свои таблицы в - (void) dealloc. –

+0

Да, это был просто подрезанный код для целей SO. Проблема заключалась в том, что сам VC выпускался на один уровень выше, поэтому буквально не было объекта VCTables, который был делегатом для таблиц, брошенных в представление. – AtomRiot

ответ

3

сообщение отправлено высвобождены, например 0x4c0ad40

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

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

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

+0

omg, говоря о зомби, я отправил VCTables для просмотра, а затем просто выпустил его, потому что я просто распределил его и больше не думал ... Спасибо, что успокоил меня, что я не сумасшедший! – AtomRiot

+0

Не беспокойтесь. Мы все были там ':)' –

Смежные вопросы