كيف يمكنني إضافة خصائص تلقائيًا في Objective-C؟

StackOverflow https://stackoverflow.com/questions/111517

  •  02-07-2019
  •  | 
  •  

سؤال

عند إضافة خصائص جديدة إلى الفئات، أجد نفسي أكتب نفس الأشياء مرارًا وتكرارًا في xcode:

  1. add TYPE *NAME; (في واجهة .h)
  2. add @property (nonatomic, retain) TYPE *NAME; (في ح)
  3. add @synthesize NAME; (في م)
  4. add [NAME release]; (في .m Dealloc)

(أنا في بيئة لا يتم جمع القمامة فيها.)

كيف يمكنني القيام بذلك تلقائيا؟

هل كانت مفيدة؟

المحلول

هذا صوت الحق.IIRC، يقول مستند Objective-C 2.0 أنك قد تكون قادرًا على ترك الخطوة رقم 1، ولكن بخلاف ذلك لا أعرف أي اختصارات.

ربما يمكنك كتابة برنامج نصي للمستخدم للقيام بذلك داخل Xcode.يرى http://www.mactech.com/articles/mactech/Vol.23/23.01/2301XCode/index.html.

نصائح أخرى

وفقا لوثائق المطور في أوقات التشغيل 64 بت، يمكنك ترك الخطوة 1.

يمكنك إلقاء نظرة على أندرو بانغ RMModelObject - لم أستخدمها، ولكنها تعمل كفئة أساسية للكائن تعمل على تبسيط عملية إنشاء النموذج.

لم أستخدمه، ولكن إليك بعض ما تم تسليط الضوء عليه في الملف التمهيدي:

  • لا حاجة للإعلان عن متغيرات الحالة،
  • لا حاجة لكتابة أساليب الوصول،
  • دعم بروتوكول NSCopying مجانًا (-copyWithZone:),
  • دعم بروتوكول NSCoding مجانًا (-initWithCoder:, -encodeWithCoder:),
  • حر -isEqual: وتنفيذ -hash`،
  • لا حاجة للكتابة -dealloc في معظم الحالات.

إليك حل آخر قمت بتعديله منههذا المقال (انظر أيضا المقالة الأولية)

كان الإصدار الموجود بالمدونة يبحث عن متغيرات خارج كتلة تعريف المتغير وكان يطابق أسماء الطرق أيضًا.لقد قمت بإصلاح بسيط للبحث فقط عن المتغيرات قبل '}' الأول.سينقطع هذا إذا كان هناك إعلانات واجهة متعددة في ملف الرأس.

لقد قمت بتعيين الإخراج على "استبدال مخروطات المستندات" وإدخاله على أنه "مستند كامل" ....

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

هناك كيفن كالاهان أكسسوارات.من صفحة الويب:

يحدد Accessorizer محددات الخصائص المناسبة استنادًا إلى نوع IVAR - ويمكن أيضًا إنشاء ملحقات صريحة (1.0) بشكل تلقائي ...لكن الملحقات يفعل الكثير ، أكثر من ذلك بكثير ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top