将UITableView和datasource / delegate放在单独的类中不起作用(XCode 4.2)

时间:2011-10-09 16:52:21

标签: objective-c xcode uitableview

我尝试将tableview的委托和数据源放入一个单独的类中。我的问题是它总是崩溃而没有错误。这就是为什么我无法弄清楚我做错了什么。也许有人可以告诉我。也许我使用ARC也很重要。

这就是我的简单代码:

//ViewController.h
@interface ViewController : UIViewController {
    UITableView *myTableView;
}

@property (strong, nonatomic) IBOutlet UITableView *myTableView;

@end

//ViewController.m
#import "ViewController.h"
#import "MyTableViewDatasourceDelegate.h"

@implementation ViewController
@synthesize myTableView;

- (void)viewDidLoad
{
    [super viewDidLoad];
    MyTableViewDatasourceDelegate *test = [[MyTableViewDatasourceDelegate alloc] init];

    self.myTableView.delegate = test;
    self.myTableView.dataSource = test;
}

@end

//MyTableViewDelegateDatasourceDelegate.h
@interface MyTableViewDatasourceDelegate : NSObject <UITableViewDataSource, UITableViewDelegate>

@end

//MyTableViewDatasourceDelegate.m
@implementation MyTableViewDatasourceDelegate

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

- (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:@"Cell"];
    }

    cell.textLabel.text = @"Test";
    return cell;
}

@end

1 个答案:

答案 0 :(得分:6)

您似乎没有在其他任何地方引用test,因此它会在viewDidLoad方法结束时自动释放。确保将test实现为实例变量,因此至少有一些参考它。

对象不需要是ivar才能坚持下去。看一下delegate属性定义:

@property(nonatomic,assign)   id <UITableViewDelegate>   delegate;

assign在这里至关重要,这意味着这是一个弱引用,UITableView不会保留此对象。请注意,如果它说(nonatomic, retain)您的代码可以正常工作,那么Apple的设计决定是以这种方式实现它以避免保留周期。