我试图在我的一个类中使用键值观察.我在init方法中注册观察者并在dealloc中删除/注销它们,但是我得到了以下错误,这似乎是在调用dealloc方法之前发生的,根据我的调试打印.
正在释放类TekkPoint的实例0x583870,而键值观察者仍在其中注册.观察信息被泄露,甚至可能被错误地附加到其他物体上.在NSKVODeallocateBreak上设置断点以在调试器中停止.这是当前的观察信息:(上下文:0x0,属性:0x536400>上下文:0x0,属性:0x55aba0>)
有什么特别的方法可以删除观察者吗?或者也许是我应该删除它们的特定地方?
根据这个问题,我正在做正确的事情,但为什么我会收到此错误消息?
这是我的dealloc例程:
- (void)dealloc {
// Remove all observers.
for (NSString *path in [TekkPoint observedPaths]) {
[self removeObserver:[option_ tChart]
forKeyPath:path];
}
[description_ release];
[weight_ release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
需要注意的一点是,我的实现可能很奇怪,我正在向观察者添加和删除观察者,这是否会导致我的问题?
objective-c key-value-observing cocoa-bindings observer-pattern
有谁知道如何卸载MacRuby?我使用RubyCocoa然后决定试用MacRuby,安装MacRuby后,RubyCocoa已经停止工作了.所以我想删除MacRuby,但我找不到任何有关如何卸载它的文档.
我今天遇到了一个奇怪的问题.我创建了一个UIView的子类,并且只为xcode提供的模板代码添加了一个方法.
@interface FloatView : UIView {
}
- (void)floatTest:(CGFloat)x;
@end
- (void)floatTest:(CGFloat)x {
NSLog(@"float was %f", x);
}
Run Code Online (Sandbox Code Playgroud)
然后在我的appDelegate中我有这样的代码:
UIView *floatView = [[FloatView alloc] init];
[floatView floatTest:10.0f];
Run Code Online (Sandbox Code Playgroud)
很简单吧?这打印出来的是什么?我认为它会像"10.0000",但不,它打印出"0.000000".
我花了几个小时挣扎,试图找出我做错了什么,然后我将appDelegate中的代码更改为
FloatView *floatView = [[FloatView alloc] init];
[floatView floatTest:10.0f];
Run Code Online (Sandbox Code Playgroud)
只有这样,它才打印出预期的"10.0000".为什么会这样?我已经将FloatView声明为UIView的子类,我不应该将一个FloatView对象分配给UIView指针而不会出现问题吗?
即使floatView被声明为UIView的指针,它实际上是一个floatView,它应该能够处理floatTest消息?我完全不在这里吗?