2008-09-21 6 views
2

Lors de l'ajout de nouvelles propriétés à des cours, je me surprends à taper les mêmes choses encore et dans Xcode:Comment puis-je ajouter automatiquement des propriétés dans Objective-C?

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

(je suis dans un environnement non collecté des déchets.)

Comment est-ce que je peux faire ceci automatiquement?

Répondre

0

Vous pouvez regarder Andrew Pang de RMModelObject - Je ne l'ai pas utilisé, mais il agit comme une classe de base d'objets qui simplifie la création de modèles.

Je ne l'ai pas utilisé, mais voici une partie de ce qui est mis en évidence dans le readme:

  • pas besoin de déclarer des variables d'instance,
  • pas besoin d'écrire ces méthodes,
  • gratuit NSCopying support de protocole (-copyWithZone:),
  • support du protocole NSCoding libre (-initWithCoder:, -encodeWithCoder:),
  • gratuit -isEqual: et -hash` implémentation,
  • pas besoin d'écrire -dealloc dans la plupart des cas.
0

Voici une autre solution que je modifiée à partir this article (voir aussi the initial article)

La version dans le blog était à la recherche des variables en dehors du bloc de déclaration variable et a correspondance entre les noms de méthode aussi. J'ai fait un correctif brut pour ne rechercher que les variables avant le premier '}'. Cela se casse s'il y a plusieurs déclarations d'interface dans le fichier d'en-tête.

Je mis la sortie "Remplacer le document Conents" et entrée comme "Document entier" ....

#!/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+([^\[email protected]].*? \*?.*?;)') 
    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 
0

Il est Kevin Callahan Accessorizer.A partir de la page Web:

Accessorizer sélectionne les spécificateurs de propriété appropriés en fonction du type de Ivar - et peut également générer des accesseurs explicites (1.0) automagiquement ... mais Accessorizer fait beaucoup, beaucoup plus ...