假设以下代码,

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


[str autorelease];

我已经多次看到,大多数程序员确实更喜欢将 alloc , init 同时放在一个语句中。

在这里,我要求将 autorelease 划分为 next 语句的可能性。
  • 例如,建议将 init 与 alloc 语句放在一起。
    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/

    10-14 23:41
    查看更多