Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 什么';s NSString*s=@";“字符串”;而NSString*s=[[NSString alloc]initWithString:@";string";]?_Objective C_Cocoa - Fatal编程技术网

Objective c 什么';s NSString*s=@";“字符串”;而NSString*s=[[NSString alloc]initWithString:@";string";]?

Objective c 什么';s NSString*s=@";“字符串”;而NSString*s=[[NSString alloc]initWithString:@";string";]?,objective-c,cocoa,Objective C,Cocoa,我认为这个问题已经很清楚了,但是——以下两者之间的区别是什么: NSString *string = @"Hello world!"; 及 如果你已经回答了,请告诉我 NSString *string = [[NSString alloc] initWithString:@"Hello world!"]; 按照cocoa as cocoa命名约定,可以使用名称以“alloc”、“new”、“copy”或“mutableCopy”开头的方法创建对象。这意味着您拥有上面的字符串,因此您负责释放该

我认为这个问题已经很清楚了,但是——以下两者之间的区别是什么:

NSString *string = @"Hello world!";

如果你已经回答了,请告诉我

NSString *string = [[NSString alloc] initWithString:@"Hello world!"];
按照cocoa as cocoa命名约定,可以使用名称以“alloc”、“new”、“copy”或“mutableCopy”开头的方法创建对象。这意味着您拥有上面的字符串,因此您负责释放该对象

NSString *string = @"Hello World";
上面的一行是字符串文字/常量,您不能分配或释放它。您不拥有此对象

按照cocoa as cocoa命名约定,可以使用名称以“alloc”、“new”、“copy”或“mutableCopy”开头的方法创建对象。这意味着您拥有上面的字符串,因此您负责释放该对象

NSString *string = @"Hello World";
上面的一行是字符串文字/常量,您不能分配或释放它。您不拥有此对象。

NSString*string=[[NSString alloc]initWithString:@“Hello World!”;
此代码创建一个强引用,变量将被保留。然后将值“Hello World!”赋给它

NSString*string=@“你好,世界!”;
这段代码只是将值“Hello World!”分配给NSString对象。它没有创建任何类型的引用。如果您的对象尚未初始化和保留,则该对象将在运行范围结束时销毁。

NSString*string=[[NSString alloc]initWithString:@“Hello World!”;
此代码创建一个强引用,变量将被保留。然后将值“Hello World!”赋给它

NSString*string=@“你好,世界!”;

这段代码只是将值“Hello World!”分配给NSString对象。它没有创建任何类型的引用。如果您的对象尚未初始化和保留,则该对象将在运行范围结束时被销毁。

实际上,在这种情况下,由于编译器的“smarts”,实际上没有什么区别。字符串常量有一个非常大的引用计数(MAXINT),编译器将把第二个例子和第一个一样对待。有趣的是,你知道我在哪里可以读到更多关于这个的内容吗?干杯。那么,如果我不拥有字符串文字,这是否意味着它将在整个应用程序执行过程中存在?是的,文字字符串被编译成二进制,并在执行应用程序的整个生命周期内持续存在。@Zaph:不完全是这样。对于每个代码示例,编译器完全按照它所说的做;第一个示例确实将创建一个string对象,并尝试使用文本字符串初始化它。字符串对象可以通过释放自身并返回字符串来响应
initWithString:
。(NSMutableString可能不会出现这种情况。)因此,结果如您所说:前面的代码最终将文本字符串分配给变量。但机制并非如此:新的额外字符串对象的创建仍然会发生,但它在赋值之前就被丢弃了。实际上,在这种情况下,由于编译器的“smarts”,实际上没有什么区别。字符串常量有一个非常大的引用计数(MAXINT),编译器将把第二个例子和第一个一样对待。有趣的是,你知道我在哪里可以读到更多关于这个的内容吗?干杯。那么,如果我不拥有字符串文字,这是否意味着它将在整个应用程序执行过程中存在?是的,文字字符串被编译成二进制,并在执行应用程序的整个生命周期内持续存在。@Zaph:不完全是这样。对于每个代码示例,编译器完全按照它所说的做;第一个示例确实将创建一个string对象,并尝试使用文本字符串初始化它。字符串对象可以通过释放自身并返回字符串来响应
initWithString:
。(NSMutableString可能不会出现这种情况。)因此,结果如您所说:前面的代码最终将文本字符串分配给变量。但机制并非如此:新的额外字符串对象的创建仍然会发生,但在赋值之前会被丢弃。对另一篇文章的引用不同,因为这个问题是关于常量字符串的。对另一篇文章的引用不同,因为这个问题是关于常量字符串的。