Pergunta

Qual é a melhor prática para reter e soltar objetos passados ??para métodos de classe?

Por exemplo, se você tem uma "variável de classe", declarou assim:

static NSString *_myString = nil

... é a coisa certa a fazer isso:

+ (void)myClassMethod:(NSString *)param {
    _myString = param;
}

... que tem a desvantagem de que o chamador precisa manter uma diferente de zero manter a contagem em param para que não seja lançado prematuramente. Alternativamente pode-se fazer isso:

+ (void)myClassMethod:(NSString *)param {
    [_myString autorelease];
    _myString = [param retain];
}

... que tem a desvantagem de que, sem uma chamada dealloc em nível de classe correspondente que irá vazar memória. Ou deveria esse tipo de variável de classe chicana ser totalmente evitado, talvez com uma única classe que gerencia o tempo de vida destes tipos de objetos de uma forma mais convencional?

Aqui estão docs da Apple sobre a criação de uma instância singleton .

O código que eu estou trabalhando com é o muito liso (mas ainda novo) objetivo do projeto Resource ( http: / /www.iphoneonrails.com/ ).

Foi útil?

Solução

Manter e liberação, absolutamente. Não é um vazamento porque a única vez quando dealloc uma classe seria chamado é quando termina o programa - no momento em que a memória será liberada de qualquer maneira. Fazê-lo a primeira maneira seria mais problemas e vai contra as diretrizes de gerenciamento de memória Cacau.

Quanto a saber se ele deve ser um método de classe ou um singleton: Classes-se geralmente não deve ter um monte de funcionalidade independente. Eles só não foram concebidos dessa maneira em Objective-C, como você pode ver com a falta de variáveis ??de classe. Métodos de classe devem geralmente lidar com criação e gerenciamento de casos, e às vezes o armazenamento de propriedades compartilhadas ou padrões para todas as instâncias. A funcionalidade real de uma classe deve ir para as instâncias. Essa é a convenção em Objective-C.

(Claro, não há Objective-C Deus e você está livre para ignorar as convenções, mas essa é a sabedoria geral.)

Outras dicas

Além disso, no caso de NSString ou qualquer classe que tem variantes mutáveis ??(como NSArray ou NSDictionary), eu recomendo fortemente copiar o parâmetro em vez de mantê-la. Se a string o chamador passado você foi um NSMutableString, seu valor pode mudar mais tarde, e ele vai mudar em sua classe também. Isto provavelmente não é o que você quer, então eu aconselho fazer isso:

+ (void)myClassMethod:(NSString *)param {
    [_myString release];
    _myString = [param copy];
}

O método copy faz uma cópia e define a contagem de reter a 1, então está tudo pronto, tanto quanto mantendo a variável está em causa. E, como um bônus extra, se o chamador faz passar-lhe uma NSString, essa classe é inteligente o suficiente para saber que o seu valor não pode mudar, então ele simplesmente mantém-se a evitar fazer uma cópia do objeto. Como inteligente é que?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top