我很困惑我要用哪種方式「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. 哪個更好:表示文件名或FileName類的字符串?
- 2. 在HashMap中使用長字符串鍵或短字符串鍵哪個更好?
- 3. 哪個先到?字符串不可變性或字符串常量
- 4. charAt()或子字符串?哪個更快?
- 5. 哪個更好:Rails中的常量或模型
- 6. 是一個常量字符指針,指向一個常量字符或指向字符的常量指針嗎?
- 7. 哪個先到?字符或字符串?
- 8. 哪一個是更快的字符串[]或列表<string>
- 9. 使用switch語句常量或枚舉? (哪個更好)? C#
- 10. 哪一個更好的FCM或GCM?
- 11. 在哪裏存儲常量字符串
- 12. 宏字符串與變量
- 13. 將字符串宏/常量轉換爲寬字符/ Unicode
- 14. 將常量字符與字符串結合到另一個常量字符
- 15. 哪一個更好的做法:全局常量還是#define?
- 16. 哪一個更快/更好strcasecmp()或等於運算符?
- 17. 混淆了for循環和字符串常量。給一個字符串常量比它能容納的更多。
- 18. 哪個更好?將整個內容作爲字符串或字符串連接傳遞?
- 19. 哪一個更好? 「var」或「DataType」?
- 20. Xamarin,Objective C或Phonegap哪一個更好?
- 21. Spring + CXF或Spring + Mule?哪一個更好?
- 22. 哪一個更好pushstate或location.hash?
- 23. DTD或XML Schema。哪一個更好?
- 24. 哪一個更好從DATE_FORMATE()或MONTH(),YEAR()
- 25. 哪一個更好JSkype或Skype4Java
- 26. TextView或WebView中哪一個更好?
- 27. Atom或RSS,哪一個更好
- 28. 哪一個更好? URLReWriter.net或URLReWriting.NET
- 29. XMPP或HTTP。哪一個更好?
- 30. 哪一個更好 - Ext.get()或document.getElementById()
我沒有得到you.by和?? – Sandy 2013-03-19 11:27:39
請解釋你想如何使用這個「常量」 – trojanfoe 2013-03-19 11:28:06
試試並比較程序集。我期望會有很小的差異 – 2013-03-19 11:28:21