目标C,NSSting与"alloc"和没有"alloc"的区别

cod*_*ons 0 objective-c

 NSString *s1 = @"string1";
 // NSString *s2 = [[NSString alloc]stringWithFormat:@"string2"];
 NSString *s2 = [[NSString alloc] initWithFormat:@"string2"];
Run Code Online (Sandbox Code Playgroud)

我知道这是非常基本的概念,但我并不是100%清楚这一点.

第一个不分配内存地址,发送一个分配内存地址...第二个增加变量的引用计数但不增加第一个...尽管我理解这个概念但不知道情况当我应该使用第一个或第二个..

我什么时候应该使用第一个?还应该什么时候用于第二个?

提前致谢..

bbu*_*bum 8

卡尔是对的,但要记住一些微妙之处.考虑一下:

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);
Run Code Online (Sandbox Code Playgroud)

输出是:

ptrs 0x1000010c0 0x1000010c0 0x1000010c0 0x100108da0
Run Code Online (Sandbox Code Playgroud)

那就对了; s1,s2s3都指向同一个字符串实例,同时s4最终成为一个新实例.这是因为NSString检测字符串何时从常量字符串初始化,并且当完全有效时,返回常量字符串而不是打扰分配新的内存块来保存相同的内容.的stringWithFormat:情况下,因为所有的潜在的格式字符串处理,使这样的优化都没有实际意义,并有可能的,不自然的实现并不那么优化可能.

换句话说,就不能假定两个字符串是相同或不同的仅通过代码检查或通过指针比较.使用isEqual:或者,更好的是isEqualToString:.