2012-10-02 92 views
0

可能有人请告诉我内存mgmt是需要的或stringWithFormat是autoreleased。我查看了Apple开发者网站上的NSString类参考文档,但是如果返回字符串副本,或者'msg'仅指向自动释放字符串的指针,则不会看到任何说明。NSString stringWithFormat和Memory Mgmt

NSString *msg; //pointer declared in interface 

- (id) init 
{ 
    //some initialization code.. 
    //is 'msg' receiving a copy or just a pointer assign 
    msg = [NSString stringWithFormat: @"%@ %@", FName, LName]; 
} 

- (void) dealloc 
{ 
    //release some vars, properties here.. 

    [msg release]; //is this correct ????  
    //Or should I be only doing: msg = nil; 

    [super dealloc]; 
} 
+0

如果你是Objective-C的新手,你应该使用ARC。 – bbum

+0

@bbum我不同意某些观点,我认为如果他没有ARC就开始他会更好地理解。除了CF对象还必须是CFRetain和CFReleased,所以最好从一开始就理解这个概念。 –

+0

希望对CF * APIs的暴露应该是最小的。而在使用CF时,没有合谋的autorelease poole,因此该模式与NS不同(并且更直截了当)。 – bbum

回答

1

好第一个问题是,你的声明伊娃

NSString *msg; 

将失去其价值,因为[NSSTring stringWithFormat]根据可可内存规则将返回一个autoreleased对象。该规则规定,任何包含alloc,new或copy的方法名都将返回一个拥有对象,即具有retain计数为1的对象,这意味着接收方将拥有该对象,其他方法将返回一个自动释放对象。在你的情况,如果你这样做,而不是:

msg = [[NSString stringWithFormat: @"%@ %@", FName, LName] retain]; 

现在你自己的对象,您可以在dealloc中发送一个释放消息

你应该只发送释放你自己的对象是你送的对象保留或复制消息,在这种情况下,因为您收到了autorelease对象,并且您没有发送保留消息或复制消息,因此您不得向其发送释放消息。发送释放消息将导致崩溃,因为msg将在该点处指向垃圾。

+0

谢谢。我是来自C++/C#世界的Obj-C的新手。还有一个问题,那么initWith的方法呢...我认为这些不是自动释放的。你能否为我澄清一下。 – badboy11

+0

@ badboy11不客气,initWith方法只是可选地初始化ivars并返回实例,换句话说,它们是构造函数。但是因为它们是在一个实例上调用的,所以你必须使用[[MyClass alloc] init],alloc意味着你将拥有该对象,因此返回的实例的保留计数为1。 –

1

如果您使用的是ARC,那么在这种情况下根本不需要做任何事情。 ARC会为你处理。如果你不使用ARC,那么你的代码可能会崩溃,因为msg变量会在运行循环结束时自动释放。

在非ARC情况下,你应该使用:

msg = [[NSString stringWithFormat: @"%@ %@", FName, LName] retain]; 

- (void) dealloc 
{ 
    [msg release]; 
    msg = nil; 
    ... 

或者更好,使用属性。

相关问题