iphone - 是否需要在 alloc 语句中设置 autorelease?

标签 iphone objective-c nsstring

假设以下代码,

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


[str autorelease];

我多次看到,大多数程序员确实更喜欢同时放置 allocinit在一个声明中。

在这里,我要求为下一条语句划分自动释放的可能性。

  • 例如,建议将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/

相关文章:

ios - 从信标确定 iDevice 的距离和方向

iphone - 有没有办法在 Objective-C 中程序运行时不断调用方法?

objective-c - 带有 UIButtons 的 UIScrollview - 如何重新创建跳板?

ios - 搜索字符串,但允许不同但相似的标点字符

ios - 使用缩写的月/日名称格式化 NSDate

iphone - 刷新通知中心内的 View Controller 类

iphone - UILocalNotification 多次触发

iphone - Xcode 5 部署目标仅限于 iOS 7

ios - 如何将ios应用程序转换为Xamarin.ios应用程序?

iphone - NSDateFormatter返回空值dateFromString:iPhone?