Objective-C でプロパティを自動的に追加するにはどうすればよいですか?
-
02-07-2019 - |
質問
新しいプロパティをクラスに追加するとき、xcode に同じ内容を何度も入力していることに気づきました。
add TYPE *NAME;
(.h インターフェース内)add @property (nonatomic, retain) TYPE *NAME;
(.h 内)add @synthesize NAME;
(.m単位)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 を省略できます。
アンドリュー・パンの記事を見てください。 RMモデルオブジェクト - 私は使用していませんが、モデルの作成を簡素化するオブジェクトの基本クラスとして機能します。
私は使用していませんが、Readme で強調表示されている内容の一部を次に示します。
- インスタンス変数を宣言する必要はありません。
- アクセサーメソッドを記述する必要はありません。
- 無料の 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
ケビン・キャラハンのものもあります アクセサリー. 。Web ページから:
Accessorizerは、IVARタイプに基づいて適切なプロパティ仕様を選択し、明示的なアクセサーズ(1.0)を自動的に生成することもできます...しかし、アクセサライザーはもっと多くのことをします...