Sag*_*ari 3 iphone objective-c nsstring
假设以下代码,
NSString *str=[[NSString alloc] initWithString:@"sagar"];
[str autorelease];
Run Code Online (Sandbox Code Playgroud)
我已经多次看到,大多数程序员都喜欢在一个语句中同时放置alloc,init.
在这里,我要求为下一个声明划分自动释放的可能性.
小智 8
大多数程序员都喜欢在一个语句中同时放置alloc,init.
那是因为初始化程序返回的实例不一定是返回的实例+alloc.例如,这是错误的并且会使程序崩溃:
NSString *str = [NSString alloc];
[str initWithString:@"sagar"];
Run Code Online (Sandbox Code Playgroud)
因为在这种情况下-initWithString:导致前一个实例的释放,并str最终指向一个解除分配的对象.这可以通过以下方式解决:
NSString *str = [NSString alloc];
str = [str initWithString:@"sagar"];
Run Code Online (Sandbox Code Playgroud)
所以str指向返回的不同实例-initWithString:.表格:
NSString *str = [[NSString alloc] initWithString:@"sagar"];
Run Code Online (Sandbox Code Playgroud)
保证str指向正确的实例.
那说,-autorelease是不同的.除非它被一个邪恶的神灵所覆盖,否则它总会让接收器本身返回.这意味着两者:
NSString *str = [[NSString alloc] initWithString:@"sagar"];
str = [str autorelease];
Run Code Online (Sandbox Code Playgroud)
和:
NSString *str = [[NSString alloc] initWithString:@"sagar"];
[str autorelease];
Run Code Online (Sandbox Code Playgroud)
是正确的,并以同样的方式工作.
至于区别:
NSString *str = [[[NSString alloc] initWithString:@"sagar"] autorelease];
Run Code Online (Sandbox Code Playgroud)
和:
NSString *str = [[NSString alloc] initWithString:@"sagar"];
…
[str autorelease];
Run Code Online (Sandbox Code Playgroud)
有些人喜欢-autorelease与分配串联使用以避免以后忘记自动释放实例.其他人更喜欢将其放在return声明中(如果有的话):
NSString *str = [[NSString alloc] initWithString:@"sagar"];
…
return [str autorelease];
Run Code Online (Sandbox Code Playgroud)
使(更)明确的是方法/函数返回一个自动释放的对象.
| 归档时间: |
|
| 查看次数: |
372 次 |
| 最近记录: |