Pergunta

Ao adicionar novas propriedades a classes, encontro-me a escrever as mesmas coisas repetidas no Xcode:

  1. add TYPE *NAME; (em relação .h)
  2. add @property (nonatomic, retain) TYPE *NAME; (em .h)
  3. add @synthesize NAME; (em .m)
  4. add [NAME release]; (em dealloc .m)

(Eu estou em um ambiente coletadas não-lixo.)

Como posso fazer isso automaticamente?

Foi útil?

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
de

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 ...

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