每当我需要创建一个新的NSString变量时,我总是分配并初始化它。似乎有时候你不想这样做。你怎么知道何时分配和初始化NSString以及何时不知道?
答案 0 :(得分:18)
每当我需要创建一个新的NSString变量时,我总是分配并初始化它。
不,这没有意义。
变量从程序遇到您声明它的那一刻起就存在:
NSString *myString;
此变量不是NSString。它是指向NSString的指针的存储。这就是*
指示的内容:该变量包含指针。
NSString 对象仅在您创建一个时存在:
[[NSString alloc] init];
并且指向该对象的指针仅在您从那里指定它的那一刻起变量:
myString = [[NSString alloc] init];
//Or, initializing the variable in its declaration:
NSString *myString = [[NSString alloc] init];
因此,如果你要从其他地方获取一个字符串对象(例如substringWithRange:
),你可以跳过创建一个新的空对象,因为你只是要将指针替换为带有指向另一个的指针的空字符串。
有时你确实想要创建一个空字符串;例如,如果您要一次一个地获取一串字符串(例如,来自NSScanner)并且想要将它们中的一些或全部连接成一个大字符串,则可以创建一个空的可变字符串(使用{{ 1}}和alloc
)并发送init
个消息来进行连接。
您还需要appendString:
release
由alloc
创建的任何对象。这是Memory Management Programming Guide中的规则之一。
答案 1 :(得分:12)
如果要将其初始化为已知值,使用alloc
几乎没有意义,您只需使用字符串文字:
NSString* myStr = @"Some value";
如果你想用格式或其他什么来初始化它,但不需要它超出当前自动释放池的生命周期,那么使用类方便方法有点简洁:
NSString* myTempStr = [NSString stringWithFormat:@"%d", myIntVar];
如果您需要使用其生命周期,请alloc
/ init
或者在前一次调用中添加retain
。我倾向于略微偏爱后者,但两者几乎相当。无论哪种方式,您都需要稍后进行平衡release
。
请注意,由于NSString
不可变,因此这种事情不仅是不必要的,而是积极地错误:
// don't do this!
NSString* myStr = [[NSString alloc] initWithString:@""];
myStr = someOtherStr;
因为它泄漏了初始占位符值。
答案 2 :(得分:4)
似乎有些时候你不想这样做。
我想不出任何时候 想要分配/初始化NSString。由于NSStringgs是不可变的,因此您几乎总是通过以下方法之一创建新字符串:
便利类方法,例如
NSString* foo = [NSString stringWithFormat:...];
字面
NSString* foo = @"literal";
NSString实例方法
NSString* foo = [bar uppercaseString];
从可变字符串中复制
NSString* foo = [mutableBar copy]; // foo needs to be released or autoreleased in this case
答案 3 :(得分:1)
我猜你指的是使用StringWithString或类似的而不是initWithString? StringWithString在引擎盖下为你分配并返回一个自动释放的字符串。
如果除了拥有字符串之外不需要进行任何字符串操作,可以使用NSString *str = @"string";
一般情况下,对iOS来说,管理内存越严格越好。这意味着如果您不需要从方法返回字符串,则应该分配init然后释放它。
如果你需要返回一个字符串,当然你需要返回一个自动释放的字符串。我不认为它比这更复杂。