如果我运行此代码:
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.我怎么知道某个方法返回一个自动释放的实例?,是否有一些命名约定?
答案 0 :(得分:3)
@"some string"
(显然不是,阅读@ BoltClock的第二条评论)和[NSString stringWithFormat:@"some string with object: %@", someObject]
都会返回autorelease
d NSString
的实例。您可以按照自己喜欢的方式使用此对象,但不拥有它(因为您没有alloc
,copy
或retain
它,所以您不必并且不应该release
自己。
此外,在您的代码中,您实际上有两个NSString
个对象,alloc
'(第1行)和alloc
为您的对象你在第2行打电话给stringWithFormat:
。在第2行,你将变量xml
重新指向第二个NSString
,但第一个仍在内存中,所以你'重新创建内存泄漏(因为你没有release
d)!无论如何,您没有alloc
第一个,因为您的第二个NSString
是您实际使用的唯一{。}}。
所以正确的代码是,摆脱release
调用和第一个NSString
:
NSString *xml = [NSString stringWithFormat:@"<%@>", @"msg"];
NSLog(@"%@\n", xml);
问题:
init...
应在alloc
之后调用,因此始终为[[Object alloc] initWithSomething]
。自动发布版本为[Object objectWithSomething]
,其基本上是这样的:return [[[Object alloc] initWithSomething] autorelease]
。
alloc
,copy
或retain
的所有内容,并且您不拥有其他所有内容。答案 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];