Iphone @&引用&引用;字符串类型,并释放您不需要的对象';我不承认这个问题

Iphone @&引用&引用;字符串类型,并释放您不需要的对象';我不承认这个问题,iphone,objective-c,ios,ipad,Iphone,Objective C,Ios,Ipad,一个愚蠢的问题 如果我有一根弦@“你好,我是一根弦”。@“是一个对象吗?它是什么?它存放在哪里 如果我释放了一个我没有创建的对象,会发生什么?或者它的复杂性是什么 NSString *string1 = [[NSString alloc] initWithString:@"string"]; NSString *string2 = string1; [string2 release]; 还有一个问题,它们之间有什么区别 NSString *string1 = [[NSString alloc]

一个愚蠢的问题

如果我有一根弦@“你好,我是一根弦”。@“是一个对象吗?它是什么?它存放在哪里

如果我释放了一个我没有创建的对象,会发生什么?或者它的复杂性是什么

NSString *string1 = [[NSString alloc] initWithString:@"string"];
NSString *string2 = string1;
[string2 release];
还有一个问题,它们之间有什么区别

NSString *string1 = [[NSString alloc] initWithString:@"string"];
NSString *string2 = @"string";
我知道我是个笨蛋,但我只是想知道

提前谢谢

编辑:


我的意思是说alloc initWithString而不是stringWithString

永远不要释放你不拥有的对象。规则很简单:只有通过使用
new
alloc
retain
copy
(简称NARC)获得对象时,您才拥有该对象

通过任何其他方法获得的对象应自动返回。这意味着对象将在下一次自动释放池排水时自动释放。如果要保留对象,需要
保留它,然后
释放它。如果您不关心对象在当前范围内使用完毕后是否被释放,那么就不要对它做任何事情

总而言之:

  • 您必须将任何NARC与
    版本配对
  • 您必须将任何非NARC与
    版本配对
  • 非NARC方法将返回
    autorelease
    d对象
  • 如果需要超出当前范围的任何
    autorelease
    d对象,则必须
    retain
    any
    autorelease
    d对象
要解决您的具体问题:

  • @“你好,我是字符串”
    是一个对象。它是
    NSConstantString
    的一个实例,在编译时创建。您不能也不应该
    释放它。它将在应用程序的整个生命周期中持续存在。更多信息,请查看
  • 如果您释放一个您不拥有的对象,那么您将减少它的保留计数,并且您将导致假定它不能保留它的代码复杂化

当对象的所有者试图释放一个未创建的对象并且该对象已被解除分配时,释放该对象最终将导致您和EXC_BAD_访问异常


关于你的第二个问题,我们进行了很好的讨论。

NSString*string2=string1

这不会创建新对象<代码>字符串1
不是对象,它是指向对象的指针。该赋值仅复制指针并将其放置在
string2

由于实施细节(内部实施细节可能并非在所有情况下都是真实的,并且永远不应该依赖它),这是正确的:

NSString *string1 = [NSString stringWithString:@"string"];
string1 == @"string"; // this is a true expression
字符串常量--@“dddd”--由编译器编译成二进制。它们无法释放,并且每个唯一字符串只有一个常量
stringthString:
识别常量,不会生成新副本

现在,如果你要做:

NSMutableString *string1 = [NSMutableString stringWithString:@"string"];
NSMutableString *string2 = string1;
[string2 release];
这将把@“string”复制到NSMutableString的新实例中,string1将指向该对象

但是,由于
stringWithString:
返回一个自动释放的对象,因此该代码将是一个过度释放(
[string1 release];
也将是)

现在,如果你要:

NSMutableString *string1 = [[NSMutableString alloc] initWithString:@"string"];
NSMutableString *string2 = string1;
[string2 release];
那么该代码在保留计数方面在技术上是正确的;字符串对象将被释放但是
发布之后
string1
string2
都将是悬空指针——也就是说,它们所持有的地址不再指向一个可行的对象,并且尝试传递这两个地址都将产生未定义的结果。

当您使用
@“
语法时,您正在创建一个对象。它是创建不可变字符串的缩写,也称为
NSConstantString
。字符串常量存储在应用程序二进制文件的数据段部分,与代码一起加载到内存中,并在运行时引用


正如其他人提到的,任何时候如果没有明确地为对象分配空间,就不应该释放它。任何时候过度释放一个对象,都会给应用程序带来意想不到的问题,通常是随机的@拉杜的解释恰到好处。

对不起,我已经知道那么多了。这不是我想要的答案。如果我错了,请纠正我。这告诉我string2基本上保留了一个指向string1的指针,如果我释放string1,就会有一个EXC_BAD_访问权限,以防原始所有者(使用+1 retaincounts)释放它并因此解除分配它。非常感谢你。我只需要知道@“”是什么,它是一个对象还是存储在堆中?告诉我你是否知道我在哪里能找到答案。我只是好奇要说清楚。。。允许
string1==@“string”的实现细节处理
[nsstringwithstring:@“string”]返回与@“string”相同的构造字符串与特殊比较无关,指针恰好是相同的。