View in English

  • Apple Developer
    • Get Started

    Explore Get Started

    • Overview
    • Learn
    • Apple Developer Program

    Stay Updated

    • Latest News
    • Hello Developer
    • Platforms

    Explore Platforms

    • Apple Platforms
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    • App Store

    Featured

    • Design
    • Distribution
    • Games
    • Accessories
    • Web
    • Home
    • CarPlay
    • Technologies

    Explore Technologies

    • Overview
    • Xcode
    • Swift
    • SwiftUI

    Featured

    • Accessibility
    • App Intents
    • Apple Intelligence
    • Games
    • Machine Learning & AI
    • Security
    • Xcode Cloud
    • Community

    Explore Community

    • Overview
    • Meet with Apple events
    • Community-driven events
    • Developer Forums
    • Open Source

    Featured

    • WWDC
    • Swift Student Challenge
    • Developer Stories
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Centers
    • Documentation

    Explore Documentation

    • Documentation Library
    • Technology Overviews
    • Sample Code
    • Human Interface Guidelines
    • Videos

    Release Notes

    • Featured Updates
    • iOS
    • iPadOS
    • macOS
    • watchOS
    • visionOS
    • tvOS
    • Xcode
    • Downloads

    Explore Downloads

    • All Downloads
    • Operating Systems
    • Applications
    • Design Resources

    Featured

    • Xcode
    • TestFlight
    • Fonts
    • SF Symbols
    • Icon Composer
    • Support

    Explore Support

    • Overview
    • Help Guides
    • Developer Forums
    • Feedback Assistant
    • Contact Us

    Featured

    • Account Help
    • App Review Guidelines
    • App Store Connect Help
    • Upcoming Requirements
    • Agreements and Guidelines
    • System Status
  • Quick Links

    • Events
    • News
    • Forums
    • Sample Code
    • Videos
 

Vidéos

Ouvrir le menu Fermer le menu
  • Collections
  • Toutes les vidéos
  • À propos

Plus de vidéos

  • À propos
  • Code
  • ARC in Swift: Basics and beyond

    Learn about the basics of object lifetimes and ARC in Swift. Dive deep into what language features make object lifetimes observable, consequences of relying on observed object lifetimes and some safe techniques to fix them.

    Ressources

    • ARC - The Swift Programming Language
      • Vidéo HD
      • Vidéo SD
  • Rechercher dans cette vidéo…
    • 1:49 - ARC Example

      class Traveler {
          var name: String
          var destination: String?
      }
      
      func test() {
          let traveler1 = Traveler(name: "Lily")
          let traveler2 = traveler1
          traveler2.destination = "Big Sur"
          print("Done traveling")
      }
    • 6:37 - Reference Cycle Example

      class Traveler {
          var name: String
          var account: Account?
          func printSummary() {
              if let account = account {
                  print("\(name) has \(account.points) points")
              }
          }
      }
      
      class Account {
          var traveler: Traveler
          var points: Int
      }
      
      func test() {
          let traveler = Traveler(name: "Lily")
          let account = Account(traveler: traveler, points: 1000)
          traveler.account = account
          traveler.printSummary()
      }
    • 9:05 - Weak Reference Example

      class Traveler {
          var name: String
          var account: Account?
          func printSummary() {
              if let account = account {
                  print("\(name) has \(account.points) points")
              }
          }
      }
      
      class Account {
          weak var traveler: Traveler?
          var points: Int
      }
      
      func test() {
          let traveler = Traveler(name: "Lily")
          let account = Account(traveler: traveler, points: 1000)
          traveler.account = account
          traveler.printSummary()
      }
    • 10:05 - Accessing an object via weak reference

      class Traveler {
          var name: String
          var account: Account?
      }
      
      class Account {
          weak var traveler: Traveler?
          var points: Int
          func printSummary() {
              print("\(traveler!.name) has \(points) points")
          }
      }
      
      func test() {
          let traveler = Traveler(name: "Lily")
          let account = Account(traveler: traveler, points: 1000)
          traveler.account = account
          account.printSummary()
      }
    • 11:14 - Accessing an object via optional binding of weak reference

      class Traveler {
          var name: String
          var account: Account?
      }
      
      class Account {
          weak var traveler: Traveler?
          var points: Int
          func printSummary() {
               if let traveler = traveler {
                  print("\(traveler.name) has \(points) points") 
               }
          }
      }
      
      func test() {
          let traveler = Traveler(name: "Lily")
          let account = Account(traveler: traveler, points: 1000)
          traveler.account = account
          account.printSummary()
      }
    • 11:45 - Safe techniques for handling weak references - withExtendedLifetime()

      func test() {
          let traveler = Traveler(name: "Lily")
          let account = Account(traveler: traveler, points: 1000)
          traveler.account = account
          withExtendedLifetime(traveler) {
              account.printSummary()
          }
      }
      
      func test() {
          let traveler = Traveler(name: "Lily")
          let account = Account(traveler: traveler, points: 1000)
          traveler.account = account
          account.printSummary()
          withExtendedLifetime(traveler) {}
      }
      
      func test() {
          let traveler = Traveler(name: "Lily")
          let account = Account(traveler: traveler, points: 1000)
          defer {withExtendedLifetime(traveler) {}}
          traveler.account = account
          account.printSummary()
      }
    • 12:55 - Safe techniques for handling weak references - Redesign to access via strong reference

      class Traveler {
          var name: String
          var account: Account?
          func printSummary() {
              if let account = account {
                  print("\(name) has \(account.points) points")
              }
          }
      }
      
      class Account {
          private weak var traveler: Traveler?
          var points: Int
      }
      
      func test() {
          let traveler = Traveler(name: "Lily")
          let account = Account(traveler: traveler, points: 1000)
          traveler.account = account
          traveler.printSummary()
      }
    • 14:20 - Safe techniques for handling weak references - Redesign to avoid weak/unowned reference

      class PersonalInfo {
          var name: String
      }
      
      class Traveler {
          var info: PersonalInfo
          var account: Account?
      }
      
      class Account {
          var info: PersonalInfo
          var points: Int
      }
    • 15:23 - Deinitializer Example

      class Traveler {
        var name: String
        var destination: String?
        deinit {
          print("\(name) is deinitializing")
        }
      }
      
      func test() {
          let traveler1 = Traveler(name: "Lily")
          let traveler2 = traveler1
          traveler2.destination = "Big Sur"
          print("Done traveling")
      }
    • 16:10 - Sequencing deinitializer side-effects with external program effects

      class Traveler {
          var name: String
          var id: UInt
          var destination: String?
          var travelMetrics: TravelMetrics
          // Update destination and record travelMetrics
          func updateDestination(_ destination: String) {
              self.destination = destination
              travelMetrics.destinations.append(self.destination)
          }
          // Publish computed metrics
          deinit {
              travelMetrics.publish()
          }
      }
      
      class TravelMetrics {
          let id: UInt
          var destinations = [String]()
          var category: String?
          // Finds the most interested travel category based on recorded destinations
          func computeTravelInterest()
          // Publishes id, destinations.count and travel interest category
          func publish()
      }
      
      func test() {
          let traveler = Traveler(name: "Lily", id: 1)
          let metrics = traveler.travelMetrics
          ...
          traveler.updateDestination("Big Sur")
          ...
          traveler.updateDestination("Catalina")
          metrics.computeTravelInterest()
      }
      
      verifyGlobalTravelMetrics()
    • 17:56 - Safe techniques for handing deinitalizer side effects - withExtendedLifetime()

      func test() {
          let traveler = Traveler(name: "Lily", id: 1)
          let metrics = traveler.travelMetrics
          ...
          traveler.updateDestination("Big Sur")
          ...
          traveler.updateDestination("Catalina")
          withExtendedLifetime(traveler) {
              metrics.computeTravelInterest()
          }
      }
    • 18:31 - Safe techniques for handing deinitalizer side effects - Redesign to limit visibility of internal class details

      class Traveler {
          ...
          private var travelMetrics: TravelMetrics
          deinit {
              travelMetrics.computeTravelInterest()
              travelMetrics.publish()
          }
      }
      
      func test() {
          let traveler = Traveler(name: "Lily", id: 1)
          ...
          traveler.updateDestination("Big Sur")
          ...
          traveler.updateDestination("Catalina")
      }
    • 19:08 - Safe techniques for handling deinitalizer side effects - Redesign to avoid deinitializer side-effects

      class Traveler {
          ...
          private var travelMetrics: TravelMetrics
           
          func publishAllMetrics() {
              travelMetrics.computeTravelInterest()
              travelMetrics.publish()
          }
      
          deinit {
      				assert(travelMetrics.published)
          }
      }
      
      class TravelMetrics {
          ...
          var published: Bool
          ...
      }
      
      func test() {
          let traveler = Traveler(name: "Lily", id: 1)
          defer { traveler.publishAllMetrics() }
          ...
          traveler.updateDestination("Big Sur")
          ...
          traveler.updateDestination("Catalina")
      }

Developer Footer

  • Vidéos
  • WWDC21
  • ARC in Swift: Basics and beyond
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    • App Store
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • Icon Composer
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • Apple Intelligence
    • Audio & Video
    • Augmented Reality
    • Business
    • Design
    • Distribution
    • Education
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning & AI
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Downloads
    • Sample Code
    • Videos
    Open Menu Close Menu
    • Help Guides & Articles
    • Contact Us
    • Forums
    • Feedback & Bug Reporting
    • System Status
    Open Menu Close Menu
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles
    • Feedback Assistant
    Open Menu Close Menu
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program
    • Mini Apps Partner Program
    • News Partner Program
    • Video Partner Program
    • Security Bounty Program
    • Security Research Device Program
    Open Menu Close Menu
    • Meet with Apple
    • Apple Developer Centers
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Academies
    • WWDC
    Read the latest news.
    Get the Apple Developer app.
    Copyright © 2026 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines