AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79336530
Accepted
Daniel Walker
Daniel Walker
Asked: 2025-01-07 23:33:22 +0800 CST2025-01-07 23:33:22 +0800 CST 2025-01-07 23:33:22 +0800 CST

Contagem de referência de um objeto não inicializado

  • 772

Tenho algum código Objective C compilado com ARC:

void func(void) {
    NSString *string;

    // Do some stuff.  Maybe return early.

    string = @"initialized";

    // Other stuff.
}

Como o ARC lida com um ponteiro de objeto não inicializado? Eu assumo que, como um ponteiro C, stringinicialmente contém lixo de pilha. Se sim, então como o ARC sabe o que fazer com ele se, digamos, eu retornasse antes de inicializar a variável?

Preciso inicializá-lo para, digamos, nil, para evitar vazamentos de memória?

Importa se a referência foi para um objeto ou bloco de despacho em vez de um NSObject?

objective-c
  • 1 1 respostas
  • 19 Views

1 respostas

  • Voted
  1. Best Answer
    Itai Ferber
    2025-01-08T00:24:35+08:002025-01-08T00:24:35+08:00

    Presumo que, como um ponteiro C, stringinicialmente contém lixo de pilha.

    Na verdade, não é o caso. Dos documentos do Clang ARC :

    É um comportamento indefinido se o armazenamento de um objeto __strongou __weaknão for inicializado corretamente antes que a primeira operação gerenciada seja executada no objeto, ou se o armazenamento de tal objeto for liberado ou reutilizado antes que o objeto tenha sido corretamente desinicializado.

    ou seja, ponteiros de objetos de lixo são inválidos de acordo com as regras ARC

    O armazenamento para um objeto __strongou __weakpode ser inicializado corretamente preenchendo-o com a representação de um ponteiro nulo, por exemplo, adquirindo a memória com callocou usando bzeropara zerá-la. Um objeto __strongou __weakpode ser desinicializado corretamente atribuindo um ponteiro nulo a ele. Um __strongobjeto também pode ser inicializado corretamente copiando para ele (por exemplo, com memcpy) a representação de um objeto diferente __strongcujo armazenamento foi inicializado corretamente; fazer isso desinicializa corretamente o objeto de origem e faz com que seu armazenamento não seja mais inicializado corretamente.

    ou seja, strongreferências são válidas quando apontam para nilou um ponteiro de objeto válido. ( weakreferências são um pouco mais complicadas)

    O ponto crucial:

    Esses requisitos são seguidos automaticamente para objetos cuja inicialização e desinicialização estão sob o controle do ARC:

    • objetos de duração de armazenamento estático, automático e temporário
    • variáveis ​​de instância de objetos Objective-C
    • elementos de matrizes onde a inicialização e a desinicialização do objeto da matriz estão sob o controle do ARC
    • campos de tipos de struct Objective-C onde a inicialização e a desinicialização do objeto struct estão sob o controle do ARC
    • membros de dados não estáticos de tipos de classe não sindicais do Objective-C++
    • Objetos e matrizes Objective-C++ de duração de armazenamento dinâmico criados com os operadores new ou new[] e destruídos com o operador delete ou delete[] correspondente

    Eles não são seguidos automaticamente para estes objetos:

    • objetos de duração de armazenamento dinâmico criados em outra memória, como aquele retornado por malloc
    • membros do sindicato

    ou seja, quase todas as variáveis ​​são automaticamente nileliminadas pelo ARC por padrão para torná-las válidas para uso.

    Então, não , você não precisa nilexpor explicitamente uma variável local definida dessa forma porque isso será feito automaticamente (embora normalmente seja uma boa prática fornecer valores padrão explícitos para tornar o comportamento mais óbvio) e não , não importa se o objeto é um objeto de despacho, bloco ou uma subclasse de NSObject(porque todos são objetos Objective-C com o mesmo comportamento).

    Você precisa ter cuidado ao zerar corretamente os ponteiros de objetos contidos em a unionou alocados manualmente usando malloc, mas esses casos são muito incomuns.

    • 1

relate perguntas

  • Cacau - Bloco implicitamente retém 'self' - Soluções diferentes

  • Editor Xcode 14.3 extremamente lento. Sempre ocupa cerca de 20 a 30 GB de RAM

  • Preciso de alguns esclarecimentos sobre dispatch_queue_create e RunLoop. Compartilhando RunLoop entre eles

  • Objective-c: definir atributo como propriedade, preserva as configurações padrão

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve