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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

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

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

Avatar for Yuta Hirakawa

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