NSString *s1 = @"string1";
// NSString *s2 = [[NSString alloc]stringWithFormat:@"string2"];
NSString *s2 = [[NSString alloc] initWithFormat:@"string2"];我知道这是非常基本的概念,但我不是100%清楚这一点。
第一个不分配内存地址,发送一个分配内存地址...第二个也会增加变量的引用计数,但第一个不会。虽然我理解这个概念,但是我不知道什么时候应该使用第一个或第二个。
我应该什么时候使用第一个?另外,第二个应该在什么时候使用?
提前谢谢..
发布于 2011-03-14 12:24:58
你永远不应该使用第二个-- +stringWithFormat:是一个类方法。包括你的第一个例子,你基本上有3个选择:
NSString *s1 = @"string1";
NSString *s2 = [[NSString alloc] initWithString:@"string2"];
NSString *s3 = [NSString stringWithFormat:@"string3"];本例中的s1是指向常量字符串的指针。s2和s3都指向您创建的新字符串,但s2已为您保留,s3已自动释放。如果您只需要一个临时对象,自动释放对象s3或常量对象s1是很好的选择。如果您需要保留字符串,则应该使用s2 (实际上,现在我认为s1在这种情况下也可以使用-尽管它并不是真正惯用的)。
您可以通过向s1或s3发送s2消息来使它们等同于retain。您还可以通过向s2发送一条autorelease消息将其转换为等效的对象。
发布于 2011-03-14 13:07:54
卡尔·伊斯是对的,但有一些微妙之处需要牢记。请考虑以下内容:
NSString *s1 = @"string1";
NSString *s2 = [[NSString alloc] initWithString:@"string1"];
NSString *s3 = [NSString stringWithString:@"string1"];
NSString *s4 = [NSString stringWithFormat:@"string1"];
NSLog(@"ptrs %p %p %p %p", s1, s2, s3, s4);输出为:
ptrs 0x1000010c0 0x1000010c0 0x1000010c0 0x100108da0没错;s1、s2和s3都指向同一个string实例,而s4最终是一个新实例。这是因为NSString会检测字符串何时从常量字符串初始化,并且在完全有效时返回常量字符串,而不是麻烦地分配新的内存块来保存相同的内容。stringWithFormat:的情况不太可能得到优化,因为所有潜在的格式字符串处理使得这样的优化对实现来说是没有意义的,而且很可能是不自然的。
换句话说,不要仅仅通过代码检查或指针比较来假设两个字符串相同或不同。使用isEqual:或更好的isEqualToString:。
发布于 2011-03-14 12:24:04
正如您已经注意到的,像@"string1" (或第二行的@"string2" )这样的字符串文字不是分配。该字符串实际上作为常量存储在可执行文件的数据部分中,就像您声明的任何常量一样。以这种方式创建的字符串实际上没有引用计数;您可以向它们发送-retain和-release消息,但什么也不会发生。
第二行的格式不正确;+stringWithFormat:实际上是一个类方法,如果没有任何格式参数,使用+stringWithFormat:就没有任何意义。一般来说,如果你没有特殊的理由使用另一种形式,只需使用字符串字面形式。如果您的应用程序中已经有一个常量浮动对象,则不需要分配新的对象。
https://stackoverflow.com/questions/5294685
复制相似问题