我在课堂上声明了NSString
类型的ivar。要初始化此ivar的值,我使用以下代码:
NSString *myVar;
-(void)inAnyMethod
{
myVar = [NSString stringWithFormat:@"%@",theValue];
}
我必须释放这个伊娃吗?根据我的理解,这不是我的责任。但在大多数情况下,我以这种方式使用的字符串会导致泄漏。
我错过了什么?
答案 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的新编译器功能。
希望它有所帮助。