如何将局部变量用作目标C中tableView的dataSource

时间:2014-02-13 14:49:29

标签: ios objective-c uitableview exc-bad-access

我有一个UITableViewController:

#import <UIKit/UIKit.h>
#import "MainClass.h"
@interface MainViewController : UITableViewController
@property (strong, nonatomic) MainClass *mainClass;
@end

我想用作表视图的数据源的类:

@interface Domain : NSObject <UITableViewDataSource>

-(id) initWithName: (NSString*)name;

@property (nonatomic, retain) NSString* name;
@property (nonatomic, retain) NSMutableArray* list;

@end

当我想测试它是否正常工作时我创建了一个本地域并在其中添加了一些文档:

Domain* domain = [[Domain alloc] init];
Document* document1 = [[Document alloc]initWithName:@"test1"];
[domain.list addObject:document1];

然后我将域声明为数据源(我重写了两个必需的方法):

self.tableView.dataSource = domain;

不幸的是,这导致了错误的访问异常。 我想这是因为局部变量太快发布了。 我猜这是因为当我将域和文件都声明为属性时,它的工作正常。 任何人都可以解释一下这个太快发布的原因以及如何避免它吗?

2 个答案:

答案 0 :(得分:2)

'dataSource'是一个弱属性,因此您必须保留对该对象的另一个引用,以使其不被释放。

因此,在视图控制器上定义属性确实是最佳解决方案。

答案 1 :(得分:1)

创建对域的强引用,例如:

@property (strong, nonatomic) Domain* domain;

并将您的域对象的分配更改为:

self.domain = [[Domain alloc] init];
Document* document1 = [[Document alloc]initWithName:@"test1"];
[self.domain.list addObject:document1];

之后:

self.tableView.dataSource = self.domain;