是否有必要在alloc语句中设置autorelease?

Sag*_*ari 3 iphone objective-c nsstring

假设以下代码,

NSString *str=[[NSString alloc] initWithString:@"sagar"];


[str autorelease];
Run Code Online (Sandbox Code Playgroud)

我已经多次看到,大多数程序员都喜欢在一个语句中同时放置alloc,init.

在这里,我要求为下一个声明划分自动释放的可能性.

  • 例如,建议将init与alloc语句放在一起.自动释放是否相同?

小智 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)

使(更)明确的是方法/函数返回一个自动释放的对象.