stringWithFormat是否创建了retain +1实例?

时间:2012-03-01 18:09:21

标签: objective-c memory-management memory-leaks nsstring retain

我在课堂上声明了NSString类型的ivar。要初始化此ivar的值,我使用以下代码:

NSString *myVar;

-(void)inAnyMethod
{
   myVar = [NSString stringWithFormat:@"%@",theValue];
}

我必须释放这个伊娃吗?根据我的理解,这不是我的责任。但在大多数情况下,我以这种方式使用的字符串会导致泄漏。

我错过了什么?

2 个答案:

答案 0 :(得分:5)

您没有release它,因为这是一种返回autoreleased对象的便捷方法。

了解您是否得到保留计数为1的内容的方法是使用Cocoa命名约定,该约定表示以new开头的任何内容,{{1在方法名称中包含alloc或将包含copy 1个对象,其他对象将返回retain个对象,就像在这种情况下一样。

答案 1 :(得分:0)

除了Oscar Gomez的回答,请注意当你使用类方法时(那些带有加号的方法你可以在文档中找到并且不包括在 Oscar Gomez 列表中,例如{{1这是其中之一),你不必担心内存管理。如果您创建自己的类方法,则应该执行相同的操作:返回自动释放对象。

关于您的代码,如果您只是将ivar分配给stringWithFormat对象(从该方法返回),则无法运行。事实上,在你的应用程序周期的某个时刻,对象将被释放(它已被放入池中),你的ivar将不再引用任何对象。

技巧:使用NSString政策创建@property或发送如下所示的copy消息:

copy

当类具有可变类型的子类时,通常使用复制。否则使用myVar = [[NSString stringWithFormat:@"%@",theValue] copy]; 。完成后,您拥有该对象,您必须记住释放它。如果你不这样做,就会导致泄漏。

retain

P.S。从Xcode 4.2开始,有一个名为ARC的新编译器功能。

希望它有所帮助。