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在执行连接时保留其委托