Swift Academy · Aula

Mutação, compartilhamento e aliasing inesperado

Veja como referências compartilhadas causam erros e como tipos por valor evitam esses problemas.

Aula 2 de 412 etapas

Mutação, compartilhamento e aliasing inesperado é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 4 aulas no total.

Boas-vindas

Referências compartilhadas ocorrem quando duas variáveis se referem ao mesmo objeto. Com tipos de valor, isso é impossível; com tipos de referência, pode causar erros inesperados. Entender essa distinção é fundamental.

Tipos de valor não criam referências compartilhadas

```swift var a = [1,2,3] var b = a // independent copy a.append(4) print(b) // [1,2,3] — unchanged ``` Cada atribuição de um tipo de valor cria uma cópia independente.

Tipos de referência DO criam referências compartilhadas

```swift class Counter { var value = 0 } let a = Counter() let b = a // SAME object a.value += 1 print(b.value) // 1 — b sees the change! ``` Tanto `a` quanto `b` apontam para o mesmo objeto na memória dinâmica.

Referências compartilhadas em parâmetros de função

```swift func increment(_ c: Counter) { c.value += 1 } let shared = Counter() increment(shared) print(shared.value) // 1 — mutated by the function ``` As classes são passadas por referência — a função altera o original.

O problema: estado mutável compartilhado

```swift class Cache { var items: [String] = [] } var cache = Cache() var cache2 = cache // aliased! cache.items.append("data") print(cache2.items) // ["data"] — unexpected! ``` É assim que partes aparentemente não relacionadas do código afetam umas às outras.

Resolvendo com tipos de valor

```swift struct Cache { var items: [String] = [] } var cache = Cache() var cache2 = cache // independent copy cache.items.append("data") print(cache2.items) // [] — unaffected ```

Resolvendo com cópia de classes

```swift func process(_ c: Counter) { var local = Counter() local.value = c.value // copy values, not reference local.value += 1 } ``` Quando precisar de semântica de referência, mas não de referências compartilhadas, copie os valores explicitamente.

Segurança entre linhas de execução e referências compartilhadas

A aliasação se torna especialmente perigosa entre linhas de execução: ```swift // Thread 1: cache.items.append("a") // Thread 2 simultaneously: cache.items.append("b") // ❌ data race! ``` Os tipos de valor na Concorrência do Swift evitam isso por padrão — somente os atores podem compartilhar estado mutável.

Detectando Aliasação Acidental

O Sanitizador de Linhas de Execução (TSan) do Xcode detecta condições de corrida em tempo de execução. Ative-o em Esquema > Diagnóstico > Sanitizador de Linhas de Execução. A Verificação de Exclusividade do Swift detecta, em tempo de execução, violações de aliasação em uma única linha de execução para parâmetros `inout`.

Padrões de Aliasação Intencional

Às vezes, a aliasação é intencional — por exemplo, um cache global: ```swift class AppCache { static let shared = AppCache() // intentional shared reference var data: [String: Any] = [:] } ``` Documente claramente o compartilhamento intencional; por padrão, evite a aliasação preferindo tipos de valor.

Verificação Rápida

O que acontece quando você atribui uma instância de classe a uma nova variável?

Recapitulação

Principais conclusões: • Tipos de valor (estruturas) — a atribuição faz uma cópia; não é possível haver aliasação • Tipos de referência (classes) — a atribuição compartilha a referência; pode haver aliasação • Aliasação entre linhas de execução = condição de corrida • Prefira estruturas por padrão; use classes somente quando for necessária uma identidade compartilhada • Use o TSan e a Verificação de Exclusividade do Swift para detectar problemas A seguir: grafos mistos de valores e referências.
Grátis para começar

Aprenda Swift com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
122
Aulas
409

Perguntas Frequentes

A aula “Mutação, compartilhamento e aliasing inesperado” é grátis?

Sim — o texto completo de “Mutação, compartilhamento e aliasing inesperado” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 4 aulas no total.

O que vou aprender em “Mutação, compartilhamento e aliasing inesperado”?

Veja como referências compartilhadas causam erros e como tipos por valor evitam esses problemas. Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Swift Academy?

Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Mutação, compartilhamento e aliasing inesperado”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Swift Academy?

Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Pilha e heap: onde os valores vivem
  2. Mutação, compartilhamento e aliasing inesperado
  3. Grafos mistos de valores e referências
  4. Design de APIs para semântica de valores
← Voltar para Swift Academy