为什么我的@lazy属性崩溃了,但是如果我让它变得非常懒惰呢?

时间:2014-06-04 09:28:41

标签: swift

我有一个懒惰属性的问题。我以为我得到了它们但也许我没有/也许它是一个错误

我班上有一个懒惰的数组

@lazy var enteredRegions = Array<String>()

现在在

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool

我有

 self.enteredRegions.append(clRegion!.identifier);

这很难用EXC_BAD_ACCESS崩溃。

现在如果我删除@lazy:

    var enteredRegions = Array<String>()

一切正常

所以......这个怎么样? :D我的理解是self.enteredRegions无论如何都会创造它

(我使用UIWindow和CLLocationManager执行此操作,并按照我的想法运行)

1 个答案:

答案 0 :(得分:4)

经过一番试验,我发现了一些很奇怪的东西。

首先,如果我们将var包装在一个类中,它只是起作用:

class RegionManager {
    @lazy var enteredRegions = Array<String>()
}

AppDelegate中,我声明了@lazy var regManager = RegionManager()

然后,在application:didFinishLaunching:中,我修改并使用该值,它可以在不吐出一个字的情况下工作:

regManager.enteredRegions.append("New!")
println("Regions: \(regManager.enteredRegions)") // Regions: [New!]

在此之后,我尝试更改为某些原生值,例如StringInt等等,它们都会失败。

所以,我的猜测是这个奇怪的行为实际上是编译器本身的一个错误,它可能根植于 native 类型的某些优化,也许是内部池或者那个苹果没有告诉我们。