2017-02-27 19 views
2

Instrumentsによると、私のiOSアプリケーションはメモリをリークしています。 InstrumentsSwift Base64の文字列がメモリをリークしています

私はこれが何を引き起こしているのかを探していて、明らかにSwiftは25000文字のbase64文字列を好まないのです。私は、コマンドラインで

leaks Application

を実行すると、私は次のエラーが表示されます

Leak: 0x7fd8a510b600 size=25088 zone: MallocHelperZone_0x11cc7a000 CFString ObjC CoreFoundation length: 24708

私はUIImageにbase64文字列をオンにする次のコードを使用します。

// MARK: Initialization 
init?(id: Int, name: String, logo: Any) { 

    self.id = id 
    self.name = name 

    if logo is String { 
     var logo = logo as! String 

     // Swift can't handle the data:image/png;base64, part of the base64 string so we remove it 
     if let range = logo.rangeOfString(";base64,", range: logo.startIndex..<logo.endIndex) { 
      logo.removeRange(logo.startIndex..<range.endIndex) 

      // Lets turn it into an UIImage 
      let imageData = NSData(base64EncodedString: logo, options: NSDataBase64DecodingOptions(rawValue: 0)) 

      if imageData != nil { 
       self.logo = UIImage(data: imageData!)! 
      } 
     } 
    } else if logo is UIImage { 
     self.logo = logo as? UIImage 
    } else { 
     self.logo = UIImage() 
    } 

    super.init() 
} 

誰かがこの問題をどのように解決できるのか考えていますか?

+0

... –

答えて

1

明らかに、rangeOfString機能で文字列の範囲を削除することが問題でした。 rangeOfString関数は '大きい'文字列を処理できません。

「詳細」>「呼び出しツリー」をクリックして、問題を見つけました。その後、自分のコードの問題がどこにあるかを確認しました。私は、正規表現にコードをリファクタリング:私は過去1週間の同様の問題で苦労されている

// Swift can't handle the data:image/png;base64, part of the base64 string so we remove it 
let regex = try! NSRegularExpression(pattern: "data:([\\w]+/[\\w]+);base64,", options: []) 
let base64 = regex.stringByReplacingMatchesInString(logo, options: [], range: NSMakeRange(0, logo.characters.count), withTemplate: "") 
関連する問題