在向类添加新属性时,我发现自己在 xcode 中一遍又一遍地输入相同的内容:
add TYPE *NAME;
(在 .h 界面中)add @property (nonatomic, retain) TYPE *NAME;
(以 .h 为单位)add @synthesize NAME;
(米)add [NAME release];
(在.m 释放)
(我处于非垃圾收集环境中。)
我怎样才能自动做到这一点?
在向类添加新属性时,我发现自己在 xcode 中一遍又一遍地输入相同的内容:
add TYPE *NAME;
(在 .h 界面中)add @property (nonatomic, retain) TYPE *NAME;
(以 .h 为单位)add @synthesize NAME;
(米)add [NAME release];
(在.m 释放)(我处于非垃圾收集环境中。)
我怎样才能自动做到这一点?
这听起来很对。IIRC,Objective-C 2.0 文档说您可能可以省略第 1 步,否则我不知道任何捷径。
您可能可以在 Xcode 中编写一个用户脚本来执行此操作。请参阅http://www.mactech.com/articles/mactech/Vol.23/23.01/2301XCode/index.html。
根据64 位运行时中的开发人员文档,您可以省略第 1 步。
您可以查看 Andrew Pang 的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)......但是 Accessorizer 做了很多很多......