如果我在头文件中声明NSString,如下所示:
{
NSString *testString;
}
@property(nonatomic,retain) NSString *testString;
然后在我的.m文件中合成字符串,初始化它的正确方法是什么?
如果我不写:
self.testString = [[NSString alloc] init];
然后它永远不会被初始化,但如果我这样做,那么这个字符串是不是被保留了两次?或者我应该以其他方式初始化它,例如:
self.testString = [NSString stringWithFormat:@"%@, sampleText];
答案 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];
这些都是有效的选择。