2017-06-09 52 views
5

Mój problem polega na tym, że nie jestem pewien, czy zamknięcie wewnątrz metody klasy może prowadzić do wycieku pamięci. Oto mój kodCzy spowoduje to wyciek pamięci w szybkiej metodzie klasy

class func SomeDownloadFun (pdfDirectory:String) { 

     let destination : DownloadRequest.DownloadFileDestination = { 
      _, response in 

//----------HERE I Reference the item 'pdfDirectory'-----Will this cause leak? 
      let fileURL = URL(fileURLWithPath: pdfDirectory) 

      return (fileURL,[.removePreviousFile,.createIntermediateDirectories]) 
     } 


     let downLoadRequest = Alamofire.download(urlStr!, to: destination) 

downLoadRequest.responseData(completionHandler: { (response) in 

       switch response.result { 
       case .success: 

//----------HERE I Reference the item 'pdfDirectory'-----Will this cause leak? 

        print("pdfDirectory") 


        break 

       case .failure: 
        print("down err") 
        break 

       } 

      }) 

}

Aa muszę wypowiedzieć się, gdzie myślę, że spowoduje to wyciek, może ktoś mi powiedzieć, dzięki!

+0

Cóż, dziękuję, ale jeśli zdefiniuj mój katalog pdfDirectory jako NSDictionary lub coś innego, spowoduje to cykl odniesienia? –

Odpowiedz

0

Kilka uwag:

  1. Tylko dlatego, że odniesienie do obiektu w zamknięciu nie znaczy, że mają silną cyklu odniesienia. Potrzebujesz odniesień kołowych (np. A ma mocne odniesienie do B, a B ma swoją silną referencję z powrotem do A), aby mieć silny cykl odniesienia, co nie występuje tutaj.

  2. The pdfDirectory nie jest nawet rodzaj odniesienia (String jest struct, typ wartości), więc nie może być silny cykl odniesienia, tak. Ma to miejsce tylko w przypadku typów odniesienia (np. class zamiast struct).

Nawet jeśli wprowadzony NSDictionary do rozmowy (rodzaj odniesienia), które same w sobie nie są wystarczające, aby istniała silna cyklu odniesienia. Nie wyciągaj pochopnych wniosków na temat silnych cykli odniesienia na podstawie istnienia zamknięcia z pewnym typem referencyjnym. Wykreślić (lub użyć "Debug memory graph" lub Instruments) jakie obiekty, do których dany obiekt ma silne referencje, i sprawdzić, czy w tym punkcie występuje silny cykl odniesienia.

+0

Cóż, niesamowicie, bardzo dziękuję –