2015-02-19 5 views
8

Ранее я использовал следующую одноплодную схему:Singleton шаблон в Swift 1.2

class Singleton { 
    class var sharedInstance : Singleton { 
     struct Static { 
      static let instance : Singleton = Singleton() 
     } 
     return Static.instance 
    } 
} 

Когда новый Xcode бета с Swift 1.2 была выпущена я хотел опробовать новые статические свойства и методы класса. Так что я пытался что-то похожее на это:

class Singleton { 
    static let sharedInstance : Singleton = Singleton() 
} 

Глядя на отладчике, используя это, кажется, как много вложенных экземпляров класса одноплодной создаются классом константы:

Screenshot of debugger

Но, глядя через распределения, кажется, что создается только один экземпляр. Я предполагаю, что это означает, что он работает правильно, но я не вижу того же поведения с первым шаблоном.

+0

Второй, казалось, работал для меня – Ian

+0

Если вы установили точку останова где-то после инициализации константы класса, разве не похоже, что есть несколько экземпляров класса в стеке? –

+0

Я установил переменную в общий экземпляр, используя второй метод в одном контроллере представления, и после вызова 'Singleton.sharedInstance.foo' во втором контроллере представления он успешно вызвал значение singleton для этого свойства. – Ian

ответ

4

Что происходит здесь является то, что LLDB показывает вам статические данные, как если бы это были данные экземпляра.

Поскольку это статические данные, в экземпляре не существует «в экземпляре», как работают обычные данные экземпляра, что приводит к тому, что LLDB считывает память, которой она не должна, и представляет ее вам, как если бы она была действительной.

В целом, отладчик не должен показывать статические данные внутри экземпляров (сравните эквивалентный C++ и способ, которым представляет LLDB).

+0

Это объясняет это. Спасибо! –