2008-09-21 2 views
2

При добавлении новых свойств классов, я нахожу, набрав те же вещи снова и снова в Xcode:Как я могу автоматически добавлять свойства в Objective-C?

  1. add TYPE *NAME; (в .h интерфейс)
  2. add @property (nonatomic, retain) TYPE *NAME; (в .h)
  3. add @synthesize NAME; (в .m)
  4. add [NAME release]; (в .m dealloc)

(я в собранной среде без мусора.)

Как это сделать автоматически?

ответ

1

Звучит примерно правильно. IIRC, документ Objective-C 2.0 говорит, что вы можете оставить шаг №1, но в противном случае я не знаю никаких ярлыков.

Возможно, вы можете написать сценарий пользователя, чтобы сделать это в Xcode. См. http://www.mactech.com/articles/mactech/Vol.23/23.01/2301XCode/index.html.

0

Вы можете посмотреть на Эндрю Pang-х RMModelObject - Я не использовал его, но он действует как объект базового класса, который упрощает создание модели.

Я не использовал его, но вот некоторые из того, что выделено в ридми:

  • нет необходимости объявлять переменные экземпляра,
  • нет необходимости писать методы доступа,
  • бесплатно поддержка протокола NSCopying (-copyWithZone:),
  • поддержка свободного NSCoding протокол (-initWithCoder:, -encodeWithCoder:),
  • бесплатно -isEqual: и -hash` реализация,
  • не нужно писать -dealloc в большинстве случаев.
0

Вот еще одно решение, которое я редактировался this article (также см the initial article)

Версия в блоге искал переменных за пределами блока объявления переменных и сопоставления имен методов тоже. Я сделал грубое исправление только для поиска переменных перед первым «}». Это сломается, если в заголовочном файле есть несколько объявлений интерфейса.

Я поставил вывод «Заменить документ Conents» и введите в качестве «Весь документ» ....

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

Существует Кевин Каллэхэна Accessorizer.На веб-странице:

Accessorizer выбирает соответствующие определители свойств на основе Ивар типа - и может также генерировать явные аксессоров (1.0) автомагически ... но Accessorizer делает многое, многое другое ...

Смежные вопросы