假设以下代码,
NSString *str=[[NSString alloc] initWithString:@"sagar"];
[str autorelease];
我多次看到,大多数程序员确实更喜欢同时放置 alloc、init在一个声明中。
在这里,我要求为下一条语句划分自动释放的可能性。
- 例如,建议将init与alloc语句放在一起。 autorelease 是否相同?
最佳答案
Most of the programmers do prefer to put alloc, init simultaneously within one statement.
那是因为初始化器返回的实例不一定是+alloc
返回的实例。例如,这是错误的并且会使您的程序崩溃:
NSString *str = [NSString alloc];
[str initWithString:@"sagar"];
因为在这种情况下 -initWithString:
导致前一个实例的释放,而 str
最终指向一个释放的对象。这可以通过以下方式解决:
NSString *str = [NSString alloc];
str = [str initWithString:@"sagar"];
以便str
指向由-initWithString:
返回的不同实例。形式:
NSString *str = [[NSString alloc] initWithString:@"sagar"];
保证 str
指向正确的实例。
也就是说,-autorelease
是不同的。除非它被邪恶的 Sprite 覆盖,否则它总是返回接收者本身。这意味着:
NSString *str = [[NSString alloc] initWithString:@"sagar"];
str = [str autorelease];
和:
NSString *str = [[NSString alloc] initWithString:@"sagar"];
[str autorelease];
都是正确的并且以同样的方式工作。
至于区别:
NSString *str = [[[NSString alloc] initWithString:@"sagar"] autorelease];
和:
NSString *str = [[NSString alloc] initWithString:@"sagar"];
…
[str autorelease];
有些人更喜欢将 -autorelease
与分配一起使用,以避免稍后忘记自动释放实例。其他人更喜欢将它放在 return
语句中(如果有的话):
NSString *str = [[NSString alloc] initWithString:@"sagar"];
…
return [str autorelease];
使(更)明确该方法/函数返回一个自动释放的对象。
关于iphone - 是否需要在 alloc 语句中设置 autorelease?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6569667/