Как я могу автоматически добавлять свойства в Objective-C? - PullRequest
2 голосов
/ 21 сентября 2008

Добавляя новые свойства в классы, я снова и снова набираю одни и те же вещи в xcode:

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

(Я нахожусь в неубранной среде.)

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

Ответы [ 5 ]

1 голос
/ 03 октября 2008

В соответствии с документацией разработчика в 64-разрядных средах выполнения вы можете пропустить шаг 1.

1 голос
/ 21 сентября 2008

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

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

0 голосов
/ 23 июня 2009

Есть аксессуар Кевина Каллахана . С веб-страницы:

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

0 голосов
/ 22 июня 2009

Вот еще одно решение, которое я модифицировал эта статья (также см. начальная статья )

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

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

#!/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
0 голосов
/ 09 октября 2008

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

Я не использовал его, но вот что выделено в файле readme:

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