Итак, у меня есть этот очень простой контроллер представления 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
Я не уверен, что он становится более основным, чем это. Пожалуйста, скажите мне, что ошибка новичков настолько болезненно очевидна, что я должен прекратить публикацию здесь. Заранее спасибо
попытайтесь сохранить свои столы при их создании - normall EXC_BAD_ACCESS означает, что что-то освобождает себя/забывается до того момента, когда вы его используете. :) Вам также нужно помнить о том, чтобы выпустить свои таблицы в - (void) dealloc. –
Да, это был просто подрезанный код для целей SO. Проблема заключалась в том, что сам VC выпускался на один уровень выше, поэтому буквально не было объекта VCTables, который был делегатом для таблиц, брошенных в представление. – AtomRiot