Como posso adicionar automaticamente propriedades em Objective-C?
-
02-07-2019 - |
Pergunta
Ao adicionar novas propriedades a classes, encontro-me a escrever as mesmas coisas repetidas no Xcode:
-
add TYPE *NAME;
(em relação .h) -
add @property (nonatomic, retain) TYPE *NAME;
(em .h) -
add @synthesize NAME;
(em .m) -
add [NAME release];
(em dealloc .m)
(Eu estou em um ambiente coletadas não-lixo.)
Como posso fazer isso automaticamente?
Solução
Isso soa sobre a direita. IIRC, o 2.0 doc Objective-C diz que você pode ser capaz de deixar de fora a etapa # 1, mas caso contrário, eu não sei de todos os atalhos.
Você provavelmente poderia escrever um script de usuário para fazê-lo dentro de Xcode. Consulte http://www.mactech.com/articles /mactech/Vol.23/23.01/2301XCode/index.html .
Outras dicas
De acordo com o desenvolvedor Documentação em 64 bits tempos de execução que você pode deixar de fora o passo 1.
Você pode olhar de Andrew Pang RMModelObject - Eu não usei -lo, mas ele age como uma classe base objeto que a criação simplifica modelo.
Eu nunca usei isso, mas aqui está um pouco do que está destacada no readme:
- não há necessidade de declarar variáveis ??de instância,
- há necessidade de escrever métodos de acesso,
- livre suporte ao protocolo NSCopying (
-copyWithZone:
),- livre suporte ao protocolo NSCoding (
-initWithCoder:
,-encodeWithCoder:
),-isEqual:
livre e implementação -hash`,- Não é necessário escrever
-dealloc
na maioria dos casos.
Aqui está outra solução que eu modifiquei a partir este artigo (veja também o artigo inicial)
A versão no blog estava procurando por variáveis ??fora do bloco de declaração variável e estava combinando nomes de métodos também. Eu fiz uma correção crude para buscar apenas variáveis ??antes do primeiro '}'. Isso vai quebrar se houver várias declarações de interface no arquivo de cabeçalho.
I definir a saída para "Substituir Documento Conents" e de entrada como "documento inteiro" ....
#!/usr/bin/python
thisfile = '''%%%{PBXFilePath}%%%'''
code = '''%%%{PBXAllText}%%%'''
selmark = '''%%%{PBXSelection}%%%'''
import re
if thisfile.endswith('.h'):
variableEnd = code.find('\n', code.find('}'))
properties = []
memre = re.compile('\s+(?:IBOutlet)?\s+([^\-+@].*? \*?.*?;)')
for match in memre.finditer(code[:variableEnd]):
member = match.group(1)
retain = member.find('*') != -1 and ', retain' or ''
property = '@property (nonatomic%s) %s' % (retain,member)
if code.find(property) == -1:
properties.append(property)
if properties:
print '%s\n\n%s%s%s%s' % (code[:variableEnd],selmark,'\n'.join(properties),selmark,code[variableEnd:])
elif thisfile.endswith('.m'):
headerfile = thisfile.replace('.m','.h')
properties = []
retains = []
propre = re.compile('@property\s\((.*?)\)\s.*?\s\*?(.*?);')
header = open(headerfile).read()
for match in propre.finditer(header):
if match.group(1).find('retain') != -1:
retains.append(match.group(2))
property = '@synthesize %s;' % match.group(2)
if code.find(property) == -1:
properties.append(property)
pindex = code.find('\n', code.find('@implementation'))
if properties and pindex != -1:
output = '%s\n\n%s%s%s' % (code[:pindex],selmark,'\n'.join(properties),selmark)
if retains:
dindex = code.find('\n', code.find('(void)dealloc'))
output += code[pindex:dindex]
retainsstr = '\n\t'.join(['[%s release];' % retain for retain in retains])
output += '\n\t%s' % retainsstr
pindex = dindex
output += code[pindex:]
print output
Há Kevin Callahan Accessorizer . A partir da página web:
Accessorizer seleciona o apropriado especificadores de propriedade com base no tipo de ivar - e também pode gerar assessores explícitos (1.0) automagicamente ... mas Accessorizer faz muito, muito mais ...