2013-03-19 22 views
1

我很困惑我要用哪種方式「seenArray」 #define kseenArray @"seenArray"NSString * const kseenArray = @"seenArray";爲什麼?關於記憶,如果有的話,我想知道哪一個更好。哪一個更好的宏或字符串常量?

+0

我沒有得到you.by和?? – Sandy 2013-03-19 11:27:39

+0

請解釋你想如何使用這個「常量」 – trojanfoe 2013-03-19 11:28:06

+0

試試並比較程序集。我期望會有很小的差異 – 2013-03-19 11:28:21

回答

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

這兩種方式似乎是一樣的! – Sandy 2013-03-19 11:43:41

+0

然後你有答案。沒有(足夠/任何)差異。 – 2013-03-19 11:49:15

+0

那麼多個對象文件引用相同的字符串文字呢? – trojanfoe 2013-03-19 12:07:22

0

const string更好。

宏一味保留副本。所以它實際上是在使用宏時創建字符串對象。

但是,將const只會引用全局字符串。

0

宏替換髮生在編譯時。因此,如果在代碼中使用宏1000x,則與編碼1000拷貝的相同字符串文字相同

使用const變量,如果引用它1000次,則仍然引用同一個變量。

+0

你想說兩個都一樣嗎? – Sandy 2013-03-19 11:36:16

+0

取決於編譯器如何處理它。智能編譯器可能會注意到您有1000個不可變的字符串文字分散到每個地方並優化它。參考const變量,你更有可能不會有重複 – gerrytan 2013-03-19 11:41:18

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

相關問題