【发布时间】:2021-05-29 21:10:56
【问题描述】:
我的情况比我在发帖前在这里看到的要复杂一些,而且我对内存管理不是很擅长。
我有一个自定义的UITableViewCell(我们将在此处称为MyCell)并在单击它时将其指针传递给UITableViewController(此处为MyController)。我传递了 指针 因为我想调用这个单元格的方法,并且引用只能通过 Objective-C 中的复制进行,因此它不会调用右侧单元格上的方法。我做了这个:
MyController.h
@interface MyController : UITableViewController {
MyCell * __autoreleasing *_cell;
}
-(instancetype)initWithCell:(MyCell * __autoreleasing *)cell;
@end
MyController.m
- (instancetype)initWithCell:(MyCell **)cell {
if (self = [super init]) {
_cell = cell;
// Checkpoint 1
}
}
然后我想稍后在我的代码中使用这个变量,例如定义部分的数量:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Checkpoint 2
return (*_cell).contents.count; // contents being an NSArray property of the custom cell
}
问题:在此处标记的“检查点”处,我有一个 NSLog(@"%ld", (unsigned long)(*_cell).contents.count);,但它在第一个检查点显示 2(正确的数字),但在第二个检查点显示 0检查点,所以基本上当我单击单元格时,会显示一个空表视图。
我曾经通过将单元格存储在nonatomic, strong 属性中来通过副本传递单元格,并且一切正常,但是由于指针引用,通过将调用从self.cell 更改为_cell,视图现在为空我说。这可能是一个内存管理问题,但我不知道如何解决它(Objective-C 相当新,第一个应用程序)。
注意:我尝试将__autoreleasing 更改为__strong,但这会导致每次访问_cell 的属性时都会崩溃。我也尝试使用 nonatomic, assign 属性来存储它而不是使用 ivar,但它并没有解决我的问题。
谢谢!
编辑:忘了说我是通过使用来调用视图控制器的
[self.navigationController pushViewController:[[MyController alloc] initWithCell:(MyCell **)&cell] animated:YES];
在我之前的视图控制器中,在tableView:didSelectRowAtIndexPath: 方法中。
【问题讨论】:
-
那么我如何从它推送的
MyController更新“调用者”单元格MyCell? -
您的链接非常全面,谢谢。我可能会做一个代表。您能否简要解释一下我应该如何重构我的代码?
-
1.不要使用单元格来存储模型数据。如果你想为它提供模型数据以便它可以自行配置,很好,但它不是用于存储,而只是用于显示和捕获。 2. 如果您有“处理”代码,也应该将其从单元格中提取出来。 3. 将数据从呈现视图控制器传回呈现视图控制器的委托协议模式。
-
非常感谢,会做的!谢谢你给我的时间。
标签: ios objective-c memory-management automatic-ref-counting