nod*_*nja 5 string cocoa memory-management objective-c nsstring
每当我需要创建一个新的NSString变量时,我总是分配并初始化它.似乎有时候你不想这样做.你怎么知道何时分配和初始化NSString以及什么时候不?
Pet*_*sey 18
每当我需要创建一个新的NSString变量时,我总是分配并初始化它.
不,这没有意义.
该变量从程序遇到您声明它的那一刻起就存在:
NSString *myString;
Run Code Online (Sandbox Code Playgroud)
此变量不是NSString.它是指向NSString的指针的存储.这就是*指示:该变量包含指针.
NSString 对象仅在您创建一个对象时存在:
[[NSString alloc] init];
Run Code Online (Sandbox Code Playgroud)
并且指向该对象的指针仅在您在其中分配时的变量中:
myString = [[NSString alloc] init];
//Or, initializing the variable in its declaration:
NSString *myString = [[NSString alloc] init];
Run Code Online (Sandbox Code Playgroud)
因此,如果你打算从别的地方得到一个字符串对象(例如,substringWithRange:),你可以跳过创建一个新的空单,因为你只是打算指针与指针替换为空字符串其他一.
有时您确实想要创建一个空字符串; 例如,如果你要在同一时间获得一串字符串之一(例如,从一个NSScanner),并想连接部分或全部成一个大的字符串,你可以创建一个空可变的字符串(使用alloc和init)并发送appendString:消息进行连接.
您还需要release创建任何对象alloc.这是" 内存管理编程指南"中的规则之一.
wal*_*lky 12
如果要将其初始化为已知值,使用时没有意义alloc,可以使用字符串文字:
NSString* myStr = @"Some value";
Run Code Online (Sandbox Code Playgroud)
如果你想用格式或其他东西初始化它,但不需要它超出当前的自动释放池生命周期,使用类方便方法有点整洁:
NSString* myTempStr = [NSString stringWithFormat:@"%d", myIntVar];
Run Code Online (Sandbox Code Playgroud)
如果你需要它的生命周期超过它,要么alloc/ init或添加retain到前一个调用.我倾向于略微偏爱后者,但两者几乎相当.无论哪种方式,您都需要release稍后进行平衡.
请注意,由于NSString不可变,这种事情不仅是不必要的,而且是积极的错误:
// don't do this!
NSString* myStr = [[NSString alloc] initWithString:@""];
myStr = someOtherStr;
Run Code Online (Sandbox Code Playgroud)
因为它泄漏了初始占位符值.
| 归档时间: |
|
| 查看次数: |
25854 次 |
| 最近记录: |