2016-03-24 19 views
2

Swift'de yinelemeli bir bellek sızıntısı ile ilgili bir sorunla karşılaştığınızda, bir başka tekil kapağın içinde bir tekil çağrılıyor.Hızlı Kapanışlar [unowned singleton]

NetworkManager.sharedInstance.doThingWithCompletion(urlString) { [unowned self] (complete) -> Void in 

     if complete == true { 

      if self.fetchedResultsController.fetchedObjects?.count > 0 { 

       CoreDataManager.sharedInstance.save(self.dictionary, completion: { (complete) -> Void in 

      }) 
     } 
    } 
} 

Tekil yakalama listesine uygun olarak nasıl eklenir? Bunu yapmalı mıyım?

Quantaliinuxite tarafından Benekli DÜZENLEME

, Çekirdek Veri Yöneticisi mimarisinin bu tür ... kesinlikle hiçbir problem bir sorunu vardı.

static let sharedInstance = BFSCoreDataManager() 

deinit { 

    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 

// MARK: - Saving 

func observeContext(context:NSManagedObjectContext) { 

    NSNotificationCenter.defaultCenter().addObserver(
     self, 
     selector:"mergeChangesFromNotification:", 
     name: NSManagedObjectContextDidSaveNotification, 
     object: nil) // ** PROBLEM WAS HERE ** 
} 

func mergeChangesFromNotification(notification:NSNotification) { 

    dispatch_async(dispatch_get_main_queue()) { 

     self.managedObjectContext.mergeChangesFromContextDidSaveNotification(notification) 
    } 
} 
+1

için kısaltılabilir Teklileri tam olarak nasıl "sızmış" olarak tanımlıyoruz? Doğası gereği hiçbir zaman serbest bırakılmazlar ... – Quantaliinuxite

+0

Evet iyi bir nokta .. Bunu tanımlamak için, iç tektonu yöntemini çağırmak, bellek çökmesine kadar üssel olarak spiraller. Yöntem boş olsa bile. – Magoo

+0

ve CDM singleton, herhangi bir noktada NetworkManager'ınızı aramıyor mu? Hata ayıklamak için yapabileceğiniz bir şey yığın izine bakmak ve tüm özlü shenanigan'ın neyle ilgili olduğunu görmek. – Quantaliinuxite

cevap

3

Tekilinizi nasıl tanımladığınıza bakmaya değer olabilir. Genel kural olarak şöyle bir şey yapıyorum:

class MySingleton { 
    static let sharedInstance = MySingleton() //The singleton 
} 

Temiz bir yığın izi kalıyor ve karışıklık yok. Başvuru için: http://krakendev.io/blog/the-right-way-to-write-a-singleton

DÜZENLEME:

hata BFSCoreDataManager sınıfta görünür. observerContext: numaralı telefondan , içeriği dinlemeyi unutuyorsunuz. Bu bellek yönetimi sorunu çözmek eğer

func observeContext(context:NSManagedObjectContext) { 

    NSNotificationCenter.defaultCenter().addObserver(
     self, 
     selector:"mergeChangesFromNotification:", 
     name: NSManagedObjectContextDidSaveNotification, 
     object: context) //context instead of nil 
} 
+2

Durağan olmama izin ver. – crashoverride777

+0

Çok doğru, bunu düzeltmeme izin ver. – Quantaliinuxite

+0

Düzenle Şerefe için – crashoverride777

1

Bilmiyorum ama yakalama listesinde singleton dahil etmek yolu şu şekildedir: işlevi olmalıdır

NetworkManager.sharedInstance.doThingWithCompletion(urlString) { 
    [unowned self, unowned dataManager = CoreDataManager.sharedInstance] (complete) -> Void in 

    if complete { 

     if self.fetchedResultsController.fetchedObjects?.count > 0 { 

      dataManager.save(self.dictionary, completion: { (complete) -> Void in 

      }) 
     } 
    } 
} 

Not da Bool değerini kontrol ederken, onu true ile karşılaştırmanıza gerek yoktur. if complete == true { ... }, if complete { ... }

+0

Tamam, bu harika ...Bunu eklemeye ve nasıl devam ettiğime bakacağım. – Magoo

+0

Bunun için teşekkürler, bilmek kolay – Magoo