【问题标题】:Observers Not Removed未删除的观察员
【发布时间】:2012-03-11 13:12:47
【问题描述】:

我正在向 UITableViewHeader 添加按钮,但收到控制台消息表明观察者在释放之前没有被删除:

类 UIButton 的实例 0x4b4750 在键值时被释放 观察者仍然在它上面注册

这是可以理解的,所以我正在尝试删除它们,但不确定解决此问题的最佳方法。唯一想到的是将它们全部添加到一个数组中,然后在 dealloc 中循环遍历它们并删除将它们创建为观察者的类。我不完全确定将哪些参数传递给[[NSNotificationCenter defaultCenter] removeObserver。每个标题视图中有三个不同的按钮,每个按钮触发不同的回调。这是否意味着我需要三个数组,为调用的每种类型的操作打开,然后使用removeTarget

【问题讨论】:

    标签: iphone objective-c ios memory memory-management


    【解决方案1】:

    来自docs

    重要通知中心不保留其观察员, 因此,您必须确保取消注册观察者(使用 removeObserver: 或 removeObserver:name:object:) 之前 解除分配。 (如果你不这样做,你会产生一个运行时错误,如果 center 向释放的对象发送消息。)

    如果您对按钮进行了子类化,那么您可以向所有观察者发布一条消息,表明可观察的 UIButton 即将失效。

    [[NSNotificationCenter defaultCenter] postNotificationName:@"UIButton_dealloc" object:self];
    

    或者,在分配按钮的类中,一旦按钮被移除,您可以:

    [[NSNotificationCenter defaultCenter] postNotificationName:@"UIButton_dealloc" object:theButton];
    

    在这两种情况下,观察者对象都会这样做:

    // The special event
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomething:) name:@"UIButton_event" object:theButton];
    // The dealloc
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(stopObserving:) name:@"UIButton_dealloc" object:theButton];
    ....
    -(void) stopObserving:(NSNotification*)notif {
        if ([name isEqualToString:@"UIButton_dealloc"]) {
            [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIButton_event" object:object]; 
        }
    }
    

    但是,对于 UIButton,这是一个有点复杂的示例,但对于其他情况可能很有用。

    【讨论】:

    • 我不确定这将如何映射到我当前使用的控制事件。要添加观察者,我目前正在使用addTarget,所以如果我使用addTarget,我是否也不需要removeTarget?无论哪种方式,一个数组是跟踪最好的方法吗?
    • 我认为会的,请参阅cocoawithlove.com/2008/06/… 了解观察者信息
    • 这仍然没有真正回答如何删除添加到 UIControlEvent 按钮的目标。我会将什么作为参数传递给removeObserver
    • 通常观察者调用removeObserver:self name:@"some_notification_name" object:theObservableObject
    • 这就是@"some_notification_name" 与我不理解的 UIButton 的 TouchUpInside 事件的关系。只是@"UIButton_TouchUpInside"?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多