【问题标题】:Should I release NSString before assigning a new value to it?我应该在为其分配新值之前释放 NSString 吗?
【发布时间】:2010-06-06 12:37:53
【问题描述】:

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

在我的课堂上,我设置了一个成员变量:

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]
}

在某些函数中,我想给这个变量一个新名字,所以我喜欢:

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

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

【问题讨论】:

标签: iphone cocoa xcode nsstring


【解决方案1】:

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

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

【讨论】:

  • 哇,Johannes,谢谢你这么快的回答!!
  • 在系统限制下,我必须在 10 分钟后接受您的回答。再次感谢。
  • @Elliot:虽然 Pablo 的建议很有价值,但请务必检查一下(即使它没有直接回答您的问题)。
  • Elliott Chen:请注意约翰内斯回答的后一段。直接赋值给实例变量 (m_movieName = …) 与赋值给属性 (self.m_movieName = …) 非常不同。具体来说,赋值给实例变量有no的副作用:之前的值不会被释放,新的值不会被保留或复制。您只是用另一个指针替换一个指针,仅此而已。仅分配给属性会触发副作用,例如内存管理。
  • 嗨,彼得,这一点对我来说是新的,它非常有用和重要。谢谢你的帮助!谢谢大家。
【解决方案2】:

首先,我的建议是,如果您使用的是 NSString 属性,请使用 copy 而不是 retain。详情请查看this SO question。

@property(nonatomic, copy) NSString *m_movieName;

【讨论】:

  • 好建议!谢谢巴勃罗!
猜你喜欢
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2018-12-31
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多