¿Cómo puedo agregar propiedades automáticamente en Objective-C?
-
02-07-2019 - |
Pregunta
Cuando agrego nuevas propiedades a las clases, me encuentro escribiendo las mismas cosas una y otra vez en xcode:
add TYPE *NAME;
(en interfaz .h)add @property (nonatomic, retain) TYPE *NAME;
(en .h)add @synthesize NAME;
(En m)add [NAME release];
(en .m Dealloc)
(Estoy en un entorno donde no se recolecta basura).
¿Cómo puedo hacer esto automáticamente?
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 ...