Upgrade to Pro — share decks privately, control downloads, hide ads and more …

メモリ最適化を究める!iOSアプリ開発における5つの重要なポイント

 メモリ最適化を究める!iOSアプリ開発における5つの重要なポイント

iOS DC 2024で発表した資料になります。

Yuta Hirakawa

August 27, 2024
Tweet

Other Decks in Programming

Transcript

  1. 7 selfが強参照になりメモリリークが発⽣する。 AVCaptureDevice.requestAccess(for: .video) { granted in if granted {

    self.isCameraAuthorized = true } } 1.クロージャ内self参照による循環参照
  2. 8 解決⽅法:  [weak self]を追加し弱参照にする。 AVCaptureDevice.requestAccess(for: .video) { [weak self] granted

    in if granted { self?.isCameraAuthorized = true } } 1.クロージャ内self参照による循環参照
  3. class Child { var parent: Parent init(parent: Parent) { self.parent

    = parent } } 9 ⼦クラスに親クラスを持たせる必要がある場合、循環参照が発⽣する。 2.親⼦クラスの循環参照
  4. class URLSessionClient { init(...) { super.init() self.session = URLSession(configuration: config,

    delegate: self, delegateQueue: queue) } } 13 URLSessionのdelegateがselfの状態にする。 4.URLSessionDelegateのextension実装
  5. 14 URLSessionDelegateをextensionで実装し、URLSessionClientの関数を 呼び出すと強参照になる。 extension URLSessionClient: URLSessionDelegate { func urlSession(_ session:

    URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { myMethod(didReceive: challenge, completion: completionHandler) } } 4.URLSessionDelegateのextension実装
  6. 15 解決⽅法:  SessionDelegate クラスを作成してデリゲート処理を分離し、  sessionClientプロパティをweakにする。 class SessionDelegate: NSObject, URLSessionDelegate {

    weak var sessionClient: URLSessionClient? func urlSession( _ session: URLSession, didReceive challenge: URLAuthenticationChallenge, ... ) { sessionClient?.myMethod(didReceive: challenge, completionHandler: completionHandler) } 4.URLSessionDelegateのextension実装
  7. 16 解決⽅法:  URLSessionClientではSessionDelegateに⾃⾝を設定する。 class URLSessionClient { private let delegate =

    SessionDelegate() init(...) { super.init() self.delegate.sessionClient = self self.session = URLSession(configuration: config, delegate: self.delegate, delegateQueue: queue) } } 4.URLSessionDelegateのextension実装
  8. 18 解決⽅法:  再利⽤しない画像はcontentsOfで読み込む。 if let path = Bundle.main.path(forResource: "imageName", ofType:

    "png"), let data = try? Data(contentsOf: URL(fileURLWithPath: path)), let image = UIImage(data: data) { Image(uiImage: image) } 5.UIImage(named:)による画像呼び出し
  9. 19 • 循環参照(強参照)に気をつける。 ◦ クロージャ ◦ 親⼦関係にあるクラス ◦ extension •

    UIImageやImageで画像を取得する場合はキャッシュされることを 意識する。 メモリ最適化を究める! iOSアプリ開発における5つの重要なポイント Yuta Hirakawa @hirasan333