Ошибка времени выполнения для файла TableViewDataSource отделена - PullRequest
1 голос
/ 23 марта 2012

Когда я отделил ViewController, включенный в файлы TableView и TableViewDataSource, Я получил ошибку во время выполнения: "..EXC_BAD_ACCESS ..".

Ниже представлен целый источник.

// ViewController file
<ViewController.h>

@interface ViewController : UIViewController <UITableViewDelegate>
@property (strong, nonatomic) UITableView *tableView;
@end

<ViewController.m>

- (void)viewDidLoad
{
    **DS1 *ds = [[DS1 alloc] init];**        
    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 100, 320, 200) style:UITableViewStylePlain]; 
    _tableView.delegate = self;
    **_tableView.dataSource = ds;**
    [self.view addSubview:_tableView];
}



// TableViewDataSource file 

<DS1.h>
@interface DS1 : NSObject <UITableViewDataSource>
@property (strong, nonatomic) NSArray *dataList;
@end


<DS1.m>
#import "DS1.h"

@implementation DS1
@synthesize dataList = _dataList;

- (id)init
{
    self = [super init];    
    if (self) {        
        _dataList = [NSArray arrayWithObjects:@"apple",@"banana", @"orange", nil]; 
    }
    return self;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
   return [_dataList count];
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }

    cell.textLabel.text = [_dataList objectAtIndex:indexPath.row];

    return cell;
}

@end

Если я изменю код ViewController.m с

     _tableView.dataSource = ds; 

до

     _tableView.dataSource = self;

, тогда все в порядке. (Конечно, после добавления методов DataSource к ViewController.m)

Я не могу найти никаких проблем, помогите мне и заранее спасибо.

1 Ответ

1 голос
/ 23 марта 2012

Если это ARC, вам нужно создать переменную экземпляра или @property для вашего источника данных.
Вы выделяете свой источник данных ds в качестве локальной переменной.Но свойство dataSource tableView не сохраняет ds.Таким образом, в конце viewDidLoad ARC выпустит ds и освободится.

сохраните ds как свойство вашего viewController.как это:

@interface ViewController : UIViewController <UITableViewDelegate>
@property (strong, nonatomic) UITableView *tableView;
@property (strong, nonatomic) DS1 *dataSource;
@end

- (void)viewDidLoad
{
    [super viewDidLoad];  // <-- !!!
    self.dataSource = [[DS1 alloc] init];
    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 100, 320, 200) style:UITableViewStylePlain]; 
    _tableView.delegate = self;
    _tableView.dataSource = self.dataSource;
    [self.view addSubview:_tableView];
}
...