Objective c UITableView setDataSource-解除分配对象错误

Objective c UITableView setDataSource-解除分配对象错误,objective-c,ios,memory-management,Objective C,Ios,Memory Management,我有一个UIViewController,其中包含以下属性: @property (weak, nonatomic) IBOutlet UITableView *customerTableView; 在UIViewController的viewDidLoad方法中,我有以下内容: - (void)viewDidLoad { [super viewDidLoad]; // ... CustomerTableViewDataSource *dataSource = [[Cu

我有一个
UIViewController
,其中包含以下属性:

@property (weak, nonatomic) IBOutlet UITableView *customerTableView;
在UIViewController的
viewDidLoad
方法中,我有以下内容:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // ...
    CustomerTableViewDataSource *dataSource = [[CustomerTableViewDataSource alloc]
        init];
    [dataSource setData:customersSource];
    [customerTableView setDataSource:dataSource];
}
我在启用NSZombies的情况下收到此消息:

*** -[CustomerTableViewDataSource numberOfSectionsInTableView:]: message sent to 
deallocated instance 0x3e07a0
解除分配的实例地址与数据源相同

数据源没有“粘滞”有什么原因吗

使用模拟器和僵尸,我看到引用在
viewDidLoad
中发布,我想这并不奇怪,因为我在该方法中声明了它,它应该不在范围之内,但是我认为调用
setDatasource
会增加refct。显然不是

我有没有办法改变这种行为


注意:如果我创建了一个ivar并存储了数据源,那么一切都能正常工作,但我觉得这会给我的课堂带来混乱。这就是城市生活吗?

即使在苹果引入ARC之前,表视图的数据源和委托(几乎每个委托都是设计上的)总是声明为(分配)而不是(保留)。如今在ARC世界,我敢肯定它被宣布为“弱”(否则它将导致一个循环)。所以,是的,在你的课堂上做一个ivar——这正是ivar的目的

注:创建单独的“数据源”和“委托”类通常是一个糟糕的设计-只要事情不变得复杂,最好使用视图控制器作为委托/数据源-在MVC中,这是为其设计的层-视图控制器,它将逻辑链接到显示器。

来自
UITableView的:

@属性(非原子,赋值)id数据源

讨论

数据源必须采用UITableViewDataSource协议不保留数据源。

这意味着
customerTableView
希望您保留数据源对象,但您没有这样做。
UITableView
的委托也是如此(事实上,除了
CALayer
的委托之外,cocoa中几乎所有的委托都是如此)。做出此设计决策的原因是:持有
UITableView
的对象通常也充当其委托。如果委托被保留,程序员将不得不处理保留周期


不幸的是,该决定的结果是您遇到的问题:现在您需要保留数据源(以及代理,如果有的话),例如通过设置ivar。

您是否在任何地方发布
CustomerSource
?您没有使用ARC吗?只是观察:NSURLConnection在执行连接时保留其委托