Pregunta

Cuando agrego nuevas propiedades a las clases, me encuentro escribiendo las mismas cosas una y otra vez en xcode:

  1. add TYPE *NAME; (en interfaz .h)
  2. add @property (nonatomic, retain) TYPE *NAME; (en .h)
  3. add @synthesize NAME; (En m)
  4. add [NAME release]; (en .m Dealloc)

(Estoy en un entorno donde no se recolecta basura).

¿Cómo puedo hacer esto automáticamente?

¿Fue útil?

Solución

Eso suena bien.IIRC, el documento Objective-C 2.0 dice que es posible que puedas omitir el paso 1, pero por lo demás no conozco ningún atajo.

Probablemente podrías escribir un script de usuario para hacerlo dentro de Xcode.Ver http://www.mactech.com/articles/mactech/Vol.23/23.01/2301XCode/index.html.

Otros consejos

Según la documentación del desarrollador en tiempos de ejecución de 64 bits, puede omitir el paso 1.

Podrías mirar el de Andrew Pang. RMModelObjeto - No lo he usado, pero actúa como una clase base de objetos que simplifica la creación del modelo.

No lo he usado, pero esto es algo de lo que está resaltado en el archivo Léame:

  • no es necesario declarar variables de instancia,
  • no es necesario escribir métodos de acceso,
  • soporte gratuito para el protocolo NSCopying (-copyWithZone:),
  • soporte gratuito para el protocolo NSCoding (-initWithCoder:, -encodeWithCoder:),
  • gratis -isEqual: y la implementación de -hash`,
  • no es necesario escribir -dealloc en la mayoría de los casos.

Aquí hay otra solución que modifiquéEste artículo (ver también el artículo inicial)

La versión en el blog buscaba variables fuera del bloque de declaración de variables y también hacía coincidir los nombres de los métodos.Hice una solución burda para buscar solo variables antes del primer '}'.Esto se romperá si hay varias declaraciones de interfaz en el archivo de encabezado.

Configuré la salida para "reemplazar el documento Conents" e ingresar como "documento completo" ....

#!/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

Está el de Kevin Callahan Accesorio.Desde la página web:

Accesorizador selecciona los especificadores de propiedades apropiados basados ​​en el tipo de IVAR, y también puede generar accesorios explícitos (1.0) automáticamente ...Pero el accesorista hace mucho, mucho más ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top