我很困惑我要用哪种方式“seenArray” #define kseenArray @"seenArray"
NSString * const kseenArray = @"seenArray";
为什么?关于记忆,如果有的话,我想知道哪一个更好。哪一个更好的宏或字符串常量?
1
A
回答
1
因为我不知道有足够的了解大会做一个总结,我已经写了测试和提供的结果,我会让你达到你自己的结论
我写了这个小测试:
#import <Foundation/Foundation.h>
NSString * const aString = @"String";
//#define aString @"String"
int main()
{
NSLog(@"%@", aString);
return 0;
}
与行编译:
gcc StringTest.m -g -m64 -framework Cocoa
这第一组件使用#define
0x0000000100000ee0 <main+0>: push %rbp
0x0000000100000ee1 <main+1>: mov %rsp,%rbp
0x0000000100000ee4 <main+4>: sub $0x10,%rsp
0x0000000100000ee8 <main+8>: lea 0x191(%rip),%rax # 0x100001080
0x0000000100000eef <main+15>: lea 0x16a(%rip),%rcx # 0x100001060
0x0000000100000ef6 <main+22>: xor %dl,%dl
0x0000000100000ef8 <main+24>: mov %rax,%rdi
0x0000000100000efb <main+27>: mov %rcx,%rsi
0x0000000100000efe <main+30>: mov %dl,%al
0x0000000100000f00 <main+32>: callq 0x100000f22 <dyld_stub_NSLog>
0x0000000100000f05 <main+37>: movl $0x0,-0x8(%rbp)
0x0000000100000f0c <main+44>: mov -0x8(%rbp),%eax
0x0000000100000f0f <main+47>: mov %eax,-0x4(%rbp)
0x0000000100000f12 <main+50>: mov -0x4(%rbp),%eax
0x0000000100000f15 <main+53>: add $0x10,%rsp
0x0000000100000f19 <main+57>: pop %rbp
0x0000000100000f1a <main+58>: retq
此组件使用NSString * const
0x0000000100000ee0 <main+0>: push %rbp
0x0000000100000ee1 <main+1>: mov %rsp,%rbp
0x0000000100000ee4 <main+4>: sub $0x10,%rsp
0x0000000100000ee8 <main+8>: mov 0x171(%rip),%rax # 0x100001060 <aString>
0x0000000100000eef <main+15>: lea 0x192(%rip),%rcx # 0x100001088
0x0000000100000ef6 <main+22>: xor %dl,%dl
0x0000000100000ef8 <main+24>: mov %rcx,%rdi
0x0000000100000efb <main+27>: mov %rax,%rsi
0x0000000100000efe <main+30>: mov %dl,%al
0x0000000100000f00 <main+32>: callq 0x100000f22 <dyld_stub_NSLog>
0x0000000100000f05 <main+37>: movl $0x0,-0x8(%rbp)
0x0000000100000f0c <main+44>: mov -0x8(%rbp),%eax
0x0000000100000f0f <main+47>: mov %eax,-0x4(%rbp)
0x0000000100000f12 <main+50>: mov -0x4(%rbp),%eax
0x0000000100000f15 <main+53>: add $0x10,%rsp
0x0000000100000f19 <main+57>: pop %rbp
0x0000000100000f1a <main+58>: retq
0
const string更好。
宏一味保留副本。所以它实际上是在使用宏时创建字符串对象。
但是,将const只会引用全局字符串。
0
2
在内存方面,我不认为它会有很大的不同,因为编译器不会创建字符串文本的副本,并且会对所有对同一个对象的引用进行引用。
不过,我觉得这是最好的:
NSString * const kseenArray = @"seenArray";
,因为它允许你做的基于对象的地址,而不是它的内容(使用[NSString isEqualToString]
),这是更快比较文字:
- (void)someMethod:(NSString *)someString
{
if (someString == kseenArray)
{
...
}
}
+0
也看看http://stackoverflow.com/questions/538996/constants-in-objective-c – 2013-03-19 11:36:57
相关问题
- 1. charAt()或子字符串?哪个更快?
- 2. 是一个常量字符指针,指向一个常量字符或指向字符的常量指针吗?
- 3. 哪个先到?字符或字符串?
- 4. 哪一个是更快的字符串[]或列表<string>
- 5. 使用switch语句常量或枚举? (哪个更好)? C#
- 6. 哪一个更好的FCM或GCM?
- 7. 哪一个更好的做法:全局常量还是#define?
- 8. 哪一个更快/更好strcasecmp()或等于运算符?
- 9. 哪个更好?将整个内容作为字符串或字符串连接传递?
- 10. C++字符串常量和静态变量初始化(或只是使用宏?)
- 11. 如何更新一个字符串变量与另一个字符串变量
- 12. 哪一个更好从DATE_FORMATE()或MONTH(),YEAR()
- 13. 哪一个更好? “var”或“DataType”?
- 14. 哪一个更好 - Ext.get()或document.getElementById()
- 15. 哪一个更好JSkype或Skype4Java
- 16. 哪一个更好:DMG或PackageMaker
- 17. 哪一个更好:mysql_connect或者mysql_pconnect
- 18. 哪一个更好pushstate或location.hash?
- 19. WPF或GTK?哪一个更好
- 20. Apache2:mod_wsgi或mod_python,哪一个更好?
- 21. Xamarin,Objective C或Phonegap哪一个更好?
- 22. Spring + CXF或Spring + Mule?哪一个更好?
- 23. 哪一个更好? URLReWriter.net或URLReWriting.NET
- 24. 哪个更好? OpenCyc或ConceptNet?
- 25. 哪个更好H2或HSQLDB?
- 26. jqGrid或dataTable,哪个更好?
- 27. PHP:ParseCSV或PHPExcel哪个更好?
- 28. 哪个更好BOOST_MPL_ASSERT或BOOST_STATIC_ASSERT?
- 29. 哪个更好,Nagios或Sensu?
- 30. 哪个更好... GATE或RapidMiner
我没有得到you.by和?? – Sandy 2013-03-19 11:27:39
请解释你想如何使用这个“常量” – trojanfoe 2013-03-19 11:28:06
试试并比较程序集。我期望会有很小的差异 – 2013-03-19 11:28:21