Iphone ObjctiveC又一个retain copy发布错误

Iphone ObjctiveC又一个retain copy发布错误,iphone,objective-c,ios,Iphone,Objective C,Ios,可能重复: 当我尝试下面的代码时,如果我释放newString,它将以错误的访问崩溃。我错过了什么 据我所知,当我使用“copy”作为访问器时,我获得了对象的所有权,所以即使我释放了另一个引用指针,retain count也应该保持1+,这样对象应该仍然在内存中 另外,这是一门独生子女课程,如果它能带来不同的话 .h文件 NSString *originalString; @property (nonatomic,copy) NSString *originalString; .m文件 @s

可能重复:

当我尝试下面的代码时,如果我释放
newString
,它将以错误的访问崩溃。我错过了什么

据我所知,当我使用“copy”作为访问器时,我获得了对象的所有权,所以即使我释放了另一个引用指针,retain count也应该保持1+,这样对象应该仍然在内存中

另外,这是一门独生子女课程,如果它能带来不同的话

.h文件

NSString *originalString;
@property (nonatomic,copy) NSString *originalString;
.m文件

@synthesize originalString;
...
NSString *newString = [[NSString alloc] init...];
self.originalString = newString;
[newString release];  //this lines makes it crash
我也试过了

self.originalString = [newString copy];

运气不好..

您是否尝试过使用
保留
而不是
复制


如果复制不起作用,我不确定这是否真的起作用,但是使用
retain
而不是
copy
会导致字符串的引用计数在分配给属性时增加1,从字符串被
alloc
ed时的1增加到2,因此使用
[newString release];
在属性赋值后的一行中,字符串应以引用计数1结束,从而继续存在。

[newString relase];//这一行使其崩溃

relase
可能不是方法的名称。您的意思是
release


假设上述问题只是你的问题中的一个排版错误,而不是代码中的一个错误,那么你的代码是正确的,并且你需要提供更多关于错误的信息。粘贴该方法的实际代码在这种情况下是有帮助的。

你可以考虑将代码迁移到具有XARC的XCODE 4.1,然后W您不必担心对象的保留和释放。

您是否尝试将自动释放添加到*newString init?然后将手动释放一起删除

NSString *newString = [[NSString alloc] init...] autorelease];

此代码看起来正确,您确定崩溃不在其他地方吗


编辑:如注释中所述,
NSString
不可变不会导致
copy
分配一个新对象。我已经编辑了可变情况的答案,以防以后有人无意中发现这一点,而没有阅读整个内容。 现在回到我们的常规编程


不知道这是否是问题所在,但请注意,如果使用可变对象(如NSMutableString)和
copy
时,不会增加保留计数,则会有效地创建一个新对象,因此会发生什么情况:

NSMutableString* newString = [[NSMutableString alloc] init..]; // allocate a new mutable string
self.originalString=newString; // this will create yet another string object
// so at this point you have 2 string objects.

[newString relase];  //this will in fact dealloc the first object
// so now you have a new object stored in originalString, but the object pointed
// to by newString is no longer in memory.
// if you try to use newString here instead of self.originalString,
// it can indeed crash.

// after you release something, it's a good idea to set it to nil to
// avoid that kind of thing
newString = nil;

在这种情况下,retain和copy之间应该没有区别,而且不管怎样,
copy
通常更适合NSString值。@BJ Homer:我已经有一段时间没有使用Objective-C了,但它看起来很简单,可以测试,如果它确实有效,他可能想弄清楚为什么一个可以工作,而另一个可以r没有。@JAB tnx这是问题的长期解释@JAB retain也没有work@BJ荷马:啊,我从卡莱布对菲利佩答案的评论中看出,为什么在这个例子中没有区别。是的,如果你真的拼写了“relase”而不是“release”,那么你会因为“无法识别的选择器”而崩溃@BJ Homer tx这是对Xcode 4.1中没有ARC的问题的详细解释。您正在寻找尚未公开发布的Xcode 4.2。因此,苹果终于开始为使用Xcode编写的iOS应用程序实施全自动引用计数?与其他功能和技术一样,苹果也花了时间来制定这一新策略。它比垃圾收集器好,速度快,效率高。您可以从WWDC 2011 videos.tx中找到更多信息。这是对问题的详细解释,只是NSString是不可变的,所以
copy
只保留字符串并返回相同的指针。请不要重复相同的问题。如果您对第一次陈述的方式不满意,您可以随时编辑原始问题。