我应该在为其分配新值之前释放NSString吗?

时间:2010-06-06 12:37:54

标签: iphone cocoa xcode nsstring

请给我一些关于如何更改NSString变量的建议。

在我班上,我设置了一个成员var:

NSString *m_movieName;
...
@property(nonatomic, retain) NSString *m_movieName;

在viewDidLoad方法中,我为此var指定了一个默认名称:

-(void)viewDidLoad{
NSString *s1 = [[NSString alloc] initWithFormat:@"Forrest Gump"];
self.m_movieName = s1;
...
[s1 release];
[super viewDidLoad]
}

在某个函数中,我想给这个var一个新名字,所以我确实喜欢:

-(void)SomeFunc{
NSString *s2 = [[NSString alloc] initWithFormat:@"Brave Heart"];
//[self.movieName release]; // ??????? Should perform here?
self.m_moiveName = s2;
[s2 release];
}

我知道,NSString * var只是指向已分配内存块的指针,'assign'操作将使用count递增此内存块。对于我的情况,我应该在为其分配值之前释放m_movieName吗?如果我不释放它(通过[self.movi​​eName release]),前一个块何时何地被释放? 非常感谢你的帮助!

2 个答案:

答案 0 :(得分:7)

不,您已将属性声明为retain,这意味着您的对象将保留属性值。在分配新值之前,合成的(=编译器生成的)setter将负责释放旧的NSString,因此您不必自己管理它。

在直接访问属性的后备存储(实例中为m_movieName)时要小心,因为绕过setter不会自动释放当前值。

答案 1 :(得分:3)

首先,我的建议是,如果您使用的是NSString媒体资源,请使用复制代替保留。检查this SO问题以获取详细信息。

@property(nonatomic, copy) NSString *m_movieName;