Joh*_*nes 15 objective-c nsnotificationcenter ios
我有一个UITableView.
在这里,我得到了不同的细胞.每个细胞都有一个模型.使用KVO和NotificationCenter,单元格会监听模型的更改.当我离开ViewController时,我收到此错误:
An instance 0x109564200 of class Model was deallocated while key value observers were still registered with it.
Observation info was leaked, and may even become mistakenly attached to some other object.
Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info:
<NSKeyValueObservationInfo 0x109429cc0> (
<NSKeyValueObservance 0x109429c50: Observer: 0x10942d1c0, Key path: name, Options: <New: NO, Old: NO, Prior: NO> Context: 0x0, Property: 0x10968fa00>
)
Run Code Online (Sandbox Code Playgroud)
在单元格中,我在设置/更改模型属性时执行此操作:
[_model addObserver:self
forKeyPath:@"name"
options:0
context:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(modelIsInvalid:)
name:@"modelIsInvalid"
object:_model];
Run Code Online (Sandbox Code Playgroud)
然后在单元格的dealloc中:
- (void)dealloc
{
NSLog(@"DEALLOC CELL");
[[NSNotificationCenter defaultCenter] removeObserver:self];
[_model removeObserver:self forKeyPath:@"name"];
}
Run Code Online (Sandbox Code Playgroud)
在模型中,我还检查它何时被取消分配:
- (void)dealloc
{
NSLog(@"DEALLOC MODEL");
}
Run Code Online (Sandbox Code Playgroud)
在所有模型之前,所有单元都被释放,但我仍然会收到此错误.另外我不确定如何设置错误中提到的断点.
它不起作用,因为细胞正在被重复使用.因此,当单元格离开屏幕时,它不会被释放,它会重新使用池.
您不应在单元格中注册通知和KVO.您应该在表视图控制器中执行此操作,当模型更改时,您应该更新模型并重新加载可见单元格.
我找到了答案.我无法删除该帖子,有人回答:)也许这对某人有用.
问题是UITableView会将之前使用的相同单元格出列,对于更长的向下行(在滚动得足够远时变得可见).
在我现在的二传手中:
// Before we set new model
if (_model) {
[_model removeObserver:self forKeyPath:@"name"];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"modelIsInvalid" object:_model];
}
_model = model;
[_model addObserver:self
forKeyPath:@"name"
options:0
context:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(modelIsInvalid:)
name:@"modelIsInvalid"
object:_model];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24422 次 |
| 最近记录: |