Eu tenho uma classe Film, cada uma das quais armazena um ID único. Em C #, Java, etc, posso definir um int staticID estático e toda vez que eu definir o ID, posso aumentar o currentID e a alteração ocorre no nível da classe e não no nível do objeto. Isso pode ser feito no Objective-C? Achei muito difícil encontrar uma resposta para isso.
fonte
initialize
é chamado uma vez para cada classe (superclasses antes das subclasses), mas se uma subclasse não substituirinitialize
, a classe paiinitialize
será chamada novamente. Portanto, um protetor é necessário se você não quiser que esse código seja executado duas vezes. Consulte Inicializando um objeto de classe nos documentos Objective-C da Apple.No Xcode 8, você pode definir propriedades de classe no Obj-C. Isso foi adicionado para interoperar com as propriedades estáticas do Swift.
Aqui está um exemplo
Então você pode acessá-lo assim:
Aqui está um post explicativo muito interessante que usei como referência para editar esta resposta antiga.
Resposta 2011: (não use isso, é terrível)
Se você realmente não quer declarar uma variável global, existe outra opção, talvez não muito ortodoxa :-), mas funciona ... Você pode declarar um método "get & set" como este, com uma variável estática dentro:
Portanto, se você precisar obter o valor, basta ligar para:
E então, quando você quiser configurá-lo:
Caso deseje definir esse pseudo-static-var como nulo, você pode declarar
testHolder
o seguinte:E dois métodos úteis:
Espero que ajude! Boa sorte.
fonte
.m
arquivos, e acho que é bom que seja "global" dentro doClass.m
arquivo.No seu arquivo .m, você pode declarar uma variável como estática:
Então você pode inicializá-lo no seu
+(void)initialize
método.Observe que essa é uma variável estática C simples e não é estática no sentido que Java ou C # consideram, mas produzirá resultados semelhantes.
fonte
No seu arquivo .m, declare uma variável global do arquivo:
em sua rotina init, verifique se:
ou se precisar mudar em outro momento (por exemplo, no seu método openConnection), então incremente-o lá. Lembre-se de que o thread não é seguro como está; você precisará fazer a sincronização (ou, melhor ainda, usar uma adição atômica), se houver algum problema de encadeamento.
fonte
Como pgb disse, não existem "variáveis de classe", apenas "variáveis de instância". A maneira objetiva-c de executar variáveis de classe é uma variável global estática dentro do arquivo .m da classe. O "estático" garante que a variável não possa ser usada fora desse arquivo (ou seja, não pode ser externa).
fonte
Aqui seria uma opção:
Observe que esse método será o único método para acessar a identificação; portanto, você precisará atualizá-lo de alguma forma neste código.
fonte
(A rigor, não é uma resposta à pergunta, mas, na minha experiência, provavelmente será útil ao procurar variáveis de classe)
Um método de classe geralmente pode desempenhar muitas das funções que uma variável de classe desempenharia em outros idiomas (por exemplo, configuração alterada durante os testes):
Agora, um objeto da classe
MyCls
chamaResource:changeSomething:
com a cadeia de caracteres@"Something general"
após uma chamada paradoTheThing:
, mas um objeto derivado daMySpecialCase
cadeia de caracteres@"Something specific"
.fonte
Você pode renomear a classe como classA.mm e adicionar recursos C ++ nela.
fonte
Outra possibilidade seria ter um pequeno
NSNumber
singleton da subclasse.fonte