iphone:发送到解除分配的实例的消息

时间:2010-09-07 16:52:46

标签: objective-c

如果我运行此代码:

NSString *xml = [[NSString alloc] init];
xml=[NSString stringWithFormat:@"<%@>", @"msg"];
NSLog(@"%@\n",xml);
[xml release];

我得到了:
2010-09-07 11:45:15.523 test[1312:207] <msg>
2010-09-07 11:45:15.527 test[1312:207] *** -[CFString release]: message sent to deallocated instance 0x3d52ba0

我有红色的记忆指南,我认为: 如果我使用alloc&amp;创建一个对象init方法,我应该释放那个对象,但规则在这里不能很好地发挥作用,为什么?

已更新

似乎这一行xml=[NSString stringWithFormat:@"<%@>", @"msg"];是问题所在。 我将其替换为xml=@"something";并且它有效。

知道为什么我不能在这里使用stringWithFormat方法吗?

已更新
谢谢你的回答@(Douwe Maan,BoltClock,Rod)

我已经更新了代码,只是测试另一种方式:

NSString *xml = [[NSString alloc] initWithFormat,@"<%@>", @"msg"];
NSLog(@"%@\n",xml);
[xml release];

有趣:如果我在启用调试选项的情况下运行该代码,我会收到一条消息: *** -[CFString _cfTypeID]: message sent to deallocated instance 0x3954ab0

但如果我在没有调试工具的情况下运行它,它就不会发送一条消息说明。

问题:
1.如果我没有使用调试工具运行项目,那么错误信息是否正常是正常的?
2.那么,initWithFormat会出现什么问题?是否与stringWithFormat相同? (我认为它不会创建一个自动释放的实例)
3.我怎么知道某个方法返回一个自动释放的实例?,是否有一些命名约定?

2 个答案:

答案 0 :(得分:3)

@"some string"(显然不是,阅读@ BoltClock的第二条评论)和[NSString stringWithFormat:@"some string with object: %@", someObject]都会返回autorelease d NSString的实例。您可以按照自己喜欢的方式使用此对象,但不拥有它(因为您没有alloccopyretain它,所以您不必并且不应该release自己。

此外,在您的代码中,您实际上有两个NSString个对象,alloc'(第1行)和alloc为您的对象你在第2行打电话给stringWithFormat:。在第2行,你将变量xml重新指向第二个NSString,但第一个仍在内存中,所以你'重新创建内存泄漏(因为你没有release d)!无论如何,您没有alloc第一个,因为您的第二个NSString是您实际使用的唯一{。}}。

所以正确的代码是,摆脱release调用和第一个NSString

NSString *xml = [NSString stringWithFormat:@"<%@>", @"msg"];
NSLog(@"%@\n", xml);

问题:

  1. 嗯,我不确定为什么会出现这个错误......
  2. {li> init...应在alloc之后调用,因此始终为[[Object alloc] initWithSomething]。自动发布版本为[Object objectWithSomething],其基本上是这样的:return [[[Object alloc] initWithSomething] autorelease]
  3. 你真的不需要知道什么做和不回复自动释放的对象,只是你拥有的,应该释放,而不是拥有。您拥有自alloccopyretain的所有内容,并且您不拥有其他所有内容。

答案 1 :(得分:0)

您可以在代码中使用stringWithFormat。正确的代码是

NSString *xml=[NSString stringWithFormat:@"<%@>", @"msg"];
NSLog(@"%@\n",xml);

消息stringWithFormat在自动释放池中分配。因此它会自动释放。您正在重用xml变量并“丢失”首先分配的指针。

如果你想保持xml的值,出于某种原因,你可能想尝试

NSString *xml = [[NSString alloc] init];
NSString *newXml=[NSString stringWithFormat:@"<%@>", @"msg"];
NSLog(@"%@\n",newXml);
[xml release];