我观察与国际志愿者组织核心数据的值,但是当我删除观察者,我得到的消息:removeObserver失败,核心数据
无法从,因为它删除观察员关键路径“flightname.value”没有注册为观察员。
下面的代码被称为两次。第一次_selectedFlight为null,所以removeObserver不会被触发。第二次我想删除,第一次被分配。观察员地址不变。
//Remove old binding.
if (_selectedFlight) {
id oi = [_selectedFlight observationInfo];
if (![oi isFault]) {
//NOTE: In somehow I cant remove it.
[_selectedFlight removeObserver:self forKeyPath:@"flightname.value"];
}
}
_selectedFlight = [_selectedRegistration.flights objectAtIndex:(_selectedRegistration.flights.count - indexPath.row - 1)];
//Bind flightname to the Summary View.
[_selectedFlight addObserver:self forKeyPath:@"flightname.value" options:0 context:NULL];
在这里你可以看到 observationInfo和removeObserver之前的一些细节的内容叫做:
(LLDB)PO OI(ID)$ 1 = 0x06b42d80( 语境:为0x0,房产:0x6b425e0>)
(LLDB)PO自(MenuViewController * const的)$ 2 = 0x08136f90
(lldb)po _selectedFlight(Flight *)$ 3 = 0x06b26770(entity:Flight; id:0x6b26ef0 ; data: { date =“0x6b1b8f0”; destination =“0x6b29140”; flightname =“0x6b29150”; id = 1; ladc = nil; loadsheet = nil; origin =“0x6b29160”; registration =“0x6e60700”; sta =“0xc81fb90”; std =“0xc8203d0”; todc =“0x6b293e0”; })
这可能是一个索引问题 - 只是为了调试它,在每个注册中的观察者列表中添加一个额外的值,并确保您获取的是您添加观察者的同一个值。 – Stavash
您还可以在删除观察者之前记录_selectedFlight和自己的地址。只是为了确保你正在移除正确的观察者。 – diederikh
0x08136f90地址没有改变。有趣的是,如果我修改了代码,并且removeObserver在我添加后立即调用,那么没问题,如果我正在导航GUI并稍后调用它,那么会发生此类崩溃。 –