Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.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
Iphone 字符串声明和赋值:3个方法_Iphone_Objective C_String_Nsstring - Fatal编程技术网

Iphone 字符串声明和赋值:3个方法

Iphone 字符串声明和赋值:3个方法,iphone,objective-c,string,nsstring,Iphone,Objective C,String,Nsstring,对于非保留字符串声明,这三行是否相同 NSString *list2 = self.map; NSString *list2 = [NSString stringWithFormat:@"%@", self.map]; NSString *list2 = [NSString stringWithString:self.map]; 它们都创建了一个自动释放的字符串对象,对吗?在这些方法中是否有首选方法,或者根据这些方法,“list2”的内存使用或行为是否有任何差异 出于某种原因,我发现obj

对于非保留字符串声明,这三行是否相同

NSString *list2 = self.map;

NSString *list2 = [NSString stringWithFormat:@"%@", self.map];

NSString *list2 = [NSString stringWithString:self.map];
它们都创建了一个自动释放的字符串对象,对吗?在这些方法中是否有首选方法,或者根据这些方法,“list2”的内存使用或行为是否有任何差异


出于某种原因,我发现objective-C中字符串的操作是与其他语言最容易混淆的转换

简单的事实是,在上述三种情况下,您并不拥有该对象, 所以你可以用, 这与开发人员的选择有关,而与性能有关

通过

它们都创建了一个自动释放的字符串对象,对吗

否,第一个仅将
string.map
返回的指针分配给
list2
。第二个和第三个从理论上讲会创建您不拥有的新的
NSStrings
,并将它们分配给
list2
。但是,如果
string.map
返回一个不可变的字符串,那么第三个可能会给您相同的指针(可能会保留并自动删除)


在所有情况下,您都不拥有(新)字符串。这就是你需要知道的全部。它们可能会自动释放,但与您使用它们无关

@Mike Weller:不,这句话不是假的
self.map
是一个属性,实际上意味着正在调用
[self map]
,它返回一个指针,该指针可能已自动释放,也可能未自动释放,具体取决于访问器的实现方式。特别是,如果指定了
非原子的
,并且合成了该属性,则该属性肯定不会被自动删除。您可以确定它可能会被自动删除,也可能不会被自动删除,但大多数默认getter实现将执行[[ivar retain]autorelease],以防止以后的setter调用使以前返回的任何值无效。我很确定这就是合成(retain)属性的实现方式。因此,如果保留self.map,我的第一个示例代码行将在技术上创建一个新的保留对象,因此我基本上增加了内存使用,以后必须[list2 release],对吗?编辑:事实上,我猜我错了,因为我不是在“复制”。它只是指向同一个对象的重复指针,对吗?@andrewjs:No。这三行中没有一行赋予您对象的所有权。如果
map
copy
属性,则可以获得对象的副本,但您不拥有它。如果你想保留它,你必须明确地保留它。这就是重点,你不能保证它是一个副本,同一个对象,自动删除或其他什么。你所知道的和需要知道的只是你并不拥有它。@Mike Weller:重点是,在第一种情况下,如果自动释放完成,它在
self.map
返回之前。所以我的语句“第一个只分配由
string.map
返回的指针”是100%正确的。