如何在Xcode 6.3.2中解决这个弱引用问题?

时间:2015-05-25 10:13:58

标签: swift generics weak-references

我已经掌握了Swift编码,但我似乎无法弄清楚这段代码有什么问题。

目标是获得一个有效的弱列表实现......

我的(显然是有缺陷的)实现总是在运行时给我一个EXC_BAD_ACCESS错误,我想它必须与swift的引用计数机制有关,但我现在已经盯着这半天了......

// a singleton test to demo the issue
class WeakListTest : SomeDelegate{

    static let instance = WeakListTest()

    private init(){
        var delegates = WeakList<SomeDelegate>()

        delegates.add(self)

        delegates.foreach({(d) -> Void in
            println("@@@@@@@@@@@@@@@@@@ get some value of our delegate \(d.someString)")  //this gives a EXC_BAD_ACCESS (code=1, ...) runtime error

        })
    }

    // SomeDelegate impl
    var someString = "bobo"

}

protocol SomeDelegate : class {
    var someString : String {get set}
}


class SomeWeakList<T:AnyObject> {
    private var list = [SomeWeakWrapper<T>]()

    func add(item: T){
        list += [SomeWeakWrapper(inner: item)]
    }

    func foreach (f : (T) -> Void) {
        list.map({(weakItem) -> Bool in
            if let item = weakItem.inner {
                println("test \(item)")
                f(item)
                return true
            } else {
                return false
            }
        });
    }
}

class SomeWeakWrapper<T:AnyObject> {
    weak private (set) var inner : T?

    init(inner : T){
        self.inner = inner
    }

}

只需获取WeakListTest的单例实例

即可触发行为
WeakListTest.instance

当你删除“弱”时,问题就会消失。来自&#39;内部&#39;的关键字SomeWeakWrapper的属性......但这显然不是一个解决方案,只是一个与引用计数有关的指标。

谢谢!

0 个答案:

没有答案