繁体   English   中英

删除观察者iOS

[英]Remove Observer iOS

我想在我的代码中删除此观察者:

[self.noteLabel addObserver:self forKeyPath:@"contentSize" options:(NSKeyValueObservingOptionNew) context:NULL];

删除它的好方法是什么? 谢谢

编辑

我要删除此观察者,因为我需要删除其parentView。 实际上,由于该观察者而导致崩溃。 删除带有观察者的子视图的良好实践是什么? 谢谢你的帮助。

每当您要删除观察者时,只需使用带有正确参数的removeObserver

[self.noteLabel removeObserver:self forKeyPath:@"contentSize"];

您提交的内容并不完全安全。 您可以使用以下代码:

#pragma mark - KVO

static void *_myContextPointer = &_myContextPointer;
- (void)enableObserver:(BOOL)enable onObject:(id)object selector:(SEL)selector {
    NSString *selectorKeyPath = NSStringFromSelector(selector);
    if (enable) {
        [object addObserver:self forKeyPath:selectorKeyPath options:0 context:&_myContextPointer];
    } else {
        @try {
            [object removeObserver:self forKeyPath:selectorKeyPath context:&_myContextPointer];
        } @catch (NSException *__unused exception) {}
    }
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (context != _myContextPointer) {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];

        return;
    }

    [self observerActionForKeyPath:keyPath ofObject:object change:change];
}

和ofc这样的代码来处理您的观察者:

- (void)observerActionForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change {
    NSString *contentSizeKeyPath = NSStringFromSelector(@selector(contentSize));
    if ([keyPath isEqualToString:contentSizeKeyPath]) {
        // do something
    }
}

然后,您只需将其命名为:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [self enableObserver:YES onObject:self selector:@selector(contentSize)];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [self enableObserver:NO onObject:self selector:@selector(contentSize)];
}

通过使用此类代码,您的应用程序不会崩溃,因为您连续删除了观察者几次。 同样,您不能在属性名称中输入错误,并且在重构代码时它会动态更改。 所有KVO都集中在一处。

您可以在NSHipster页面上阅读有关安全KVO的更多信息。

通常,您开始在-init观察一些关键路径,然后在-dealloc停止-dealloc

我会在-dealloc注销自己。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM