NSString 文字之间的区别

2023-11-27

这两行有什么区别?

NSString * string = @"My String";
NSString * string = [[[NSString alloc] initWithString:@"MyString"] autorelease]

@“My String”是编译成二进制文件的文字字符串。加载后,它在内存中占有一席之地。第一行声明一个指向内存中该点的变量。

来自字符串编程指南:

在源代码中创建字符串对象的最简单方法是使用 Objective-C @"..." 结构:

NSString *temp = @"/tmp/scratch"; 

请注意,创建字符串时 以这种方式保持不变,您应该避免使用除 7 位之外的任何内容 ASCII 字符。这样的对象是在编译时创建并存在的 在程序的整个执行过程中。编译器生成这样的对象 每个模块的常量都是唯一的,并且它们永远不会被释放, 尽管您可以像处理任何其他对象一样保留和释放它们。

第二行通过获取该文字字符串来分配一个字符串。请注意,两个@“My String”文字字符串是相同的。为了证明这一点:

NSString *str = @"My String";
NSLog(@"%@ (%p)", str, str);

NSString *str2 = [[NSString alloc] initWithString:@"My String"];
NSLog(@"%@ (%p)", str2, str2);

NSString *copy = [str2 stringByAppendingString:@"2"];
NSLog(@"%@ (%p)", copy, copy);

输出相同的内存地址:

2011-11-07 07:11:26.172 Craplet[5433:707] My String (0x100002268)
2011-11-07 07:11:26.174 Craplet[5433:707] My String (0x100002268)
2011-11-07 07:11:26.174 Craplet[5433:707] My String2 (0x1003002a0)

重要的是,不仅前两个字符串具有相同的内存地址,而且如果不更改代码,每次运行它时它都是相同的内存地址。它与内存中的二进制偏移量相同。但是,不仅副本不同,而且每次运行它时都会不同,因为它是在堆上分配的。

根据上面的文档参考,自动释放没有影响。您可以释放它们,但它们永远不会被释放。因此,它们相等并不是因为两者都是自动释放的字符串,而是因为它们都是常量并且释放被忽略。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSString 文字之间的区别 的相关文章

随机推荐