内存管理,我应该保留吗?

时间:2012-01-27 13:56:42

标签: objective-c ios memory-management

如果我在头文件中声明NSString,如下所示:

{
  NSString *testString; 
}
@property(nonatomic,retain) NSString *testString;

然后在我的.m文件中合成字符串,初始化它的正确方法是什么? 如果我不写:      self.testString = [[NSString alloc] init];

然后它永远不会被初始化,但如果我这样做,那么这个字符串是不是被保留了两次?或者我应该以其他方式初始化它,例如:

self.testString = [NSString stringWithFormat:@"%@, sampleText];

4 个答案:

答案 0 :(得分:2)

你是对的,前者会过度保留对象。

请改用第二种形式 但是,如果必须直接使用 ivar ,则需要保留对象:

testString = [[NSString stringWithFormat:@"%@, sampleText] retain];

答案 1 :(得分:1)

self.testString = [NSString stringWithFormat:@"%@, sampleText];self.testString = [NSString string];是正确的; self.testString = [[NSString alloc] init];会导致过度保留。

考虑为您的项目使用ARC(自动保留计数)。使用ARC,编译器会处理保留计数,因此实际上不允许这样做。有一个重构将转换当前项目。

答案 2 :(得分:1)

您似乎在.h中声明了一个名为testString的变量,并且您还创建了一个保留的属性。

你可以使用它:

self.testString = [NSString string];

或者您可以使用

testString = [[NSString alloc] init];

通过属性定义变量将导致它被保留,这就是你将其声明为(非原子,保留)的原因。通过声明定义变量不会考虑这些参数。这是关于保留的快速经验法则。

使用您的代码作为基础:

self.testString = [[NSString alloc] init]; // Retain count = 2
self.testString = [NSString string];       // Retain count = 1
testString = [[NSString alloc] init];      // Retain count = 1
testString = [NSString string];            // Not retained at all.

答案 3 :(得分:0)

首先@property (nonatomic, copy) NSString *testString以避免可变性错误。 第二 - 如果你只想要一个没有泄漏的字符串:

self.testString = [NSString string];
self.testString = [[[NSString alloc] init] autorelease];
self.testString = [NSString stringWithFormat:@"%@", text];

这些都是有效的选择。