假设以下代码,
NSString *str=[[NSString alloc] initWithString:@"sagar"];
[str autorelease];
我已经多次看到,大多数程序员确实更喜欢将 alloc , init 同时放在一个语句中。
在这里,我要求将 autorelease 划分为 next 语句的可能性。
autorelease 是一样的吗?
最佳答案
这是因为初始化程序返回的实例不一定是 +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
是不同的。除非它被邪恶的 djinn 覆盖,否则它总是返回接收器本身。这意味着: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/