标签: reference-cycle

如果[应该]销毁观察者,如何在python中正确实现Observer

我在python中实现了一个观察者可观察的模式:

这是Observable类:

class Observable(object):
    def __init__(self, value):
        self.value = value
        self.observers = []

    def set(self, value):
        old = self.value
        self.value = value
        self.notifyObservers(old, self.value)

    def get(self):
        return self.value

    def addObserver(self, o):
        self.observers.append(o)

    def removeObserver(self, o):
        if o in self.observers:
            self.observers.remove(o)

    def notifyObservers(self, old, new):
        for o in self.observers:
            o.valueChanged(old, new)
Run Code Online (Sandbox Code Playgroud)

这是一个观察者:

class Observer(object):
    def __init__(self, foo):
        self.foo = foo
        self.foo.addObserver(self)

    def __del__(self):
        print('Observer.__del__ called')
        self.foo.removeObserver(self)

    def valueChanged(self, old, new):
        print('foo changed from %s to %s' % (old, new))
Run Code Online (Sandbox Code Playgroud)

代码按预期工作.

但是我需要将 …

python observer-pattern reference-cycle

6
推荐指数
1
解决办法
556
查看次数

使用计时器的引用循环中的强、弱或无主

我有一个对重复调用闭包的对象UIViewController的引用。Timer对象在其块中Timer捕获。self据我了解,这会导致retains cycle视图控制器和块之间的关系。有一个逻辑将定时器设置为nil,然后保留周期被打破,但它可能不会被执行。

我的问题如下:视图控制器将随着应用程序的存在而存在(至少在当前的实现中)。在这种情况下 - 我应该如何最好地处理这个保留周期?我应该忽略它吗,因为视图控制器无论如何都不会被释放。我应该考虑未来可能发生的变化并用unownedweak参考文献以及哪一个来处理它。我想这应该是unowned因为计时器仅由视图控制器保留,并且一旦视图控制器被释放,它应该被释放,但不确定我是否遗漏了一些东西。先感谢您。下面的代码是我正在谈论的内容的简单示例。Class A是视图控制器。

class A {

    var timer: Timer? = nil
    var varToReference: Int = 0

    func startTimer() {
        timer = Timer.scheduledTimer(withTimeInterval: 2, repeats: true, block: {  (theTimer) in

            self.varToReference += 1

        })
    }

    func stopTimer() {
        if let theTimer = timer {
            theTimer.invalidate()
            timer = nil
        }
    }

    func onAdapterStarts() {
        self.startTimer()
    }

    func onAdapterStops(){
        self.stopTimer()
    }

    deinit …
Run Code Online (Sandbox Code Playgroud)

closures memory-leaks ios swift reference-cycle

5
推荐指数
1
解决办法
2467
查看次数

块中的@synchronized(self)会导致保留周期吗?

假设我想@synchronized(self)在一个区块内做.我想这会导致保留周期,所以通常我们会像这样重写它:

-(void)myMethod
{
    __weak TheClass * weakSelf = self;
    dispatch_async(dispatch_get_main_queue(),
    ^{
        TheClass * strongSelf = weakSelf;
        if(strongSelf == nil)
        {
            return;
        }

        @synchronized(strongSelf)
        {
            //mutex code
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,当你以@synchronized这种方式使用指令时,它是否相当于@synchronized(self)

memory-management objective-c synchronized objective-c-blocks reference-cycle

1
推荐指数
1
解决办法
793
查看次数