2013-03-19 108 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

相关问题