Objective c 保留一个不合理的论点-为什么?

Objective c 保留一个不合理的论点-为什么?,objective-c,nsarray,retain,Objective C,Nsarray,Retain,我试着找,但找不到任何帮助 - (NSArray *)sushiTypes { return _sushiTypes; } - (void)setSushiTypes:(NSArray *)sushiTypes { [sushiTypes retain]; [_sushiTypes release]; _sushiTypes = sushiTypes; } 我想知道的是,当我在做教程的时候,我不明白他为什么保留这个论点。我试着注释了那个retain语句,程序也

我试着找,但找不到任何帮助

- (NSArray *)sushiTypes {
    return _sushiTypes;
}

- (void)setSushiTypes:(NSArray *)sushiTypes {
    [sushiTypes retain];
    [_sushiTypes release];
    _sushiTypes = sushiTypes;
}
我想知道的是,当我在做教程的时候,我不明白他为什么保留这个论点。我试着注释了那个retain语句,程序也一样工作,没有泄漏。那么,这是没有必要的吗

我还想补充一个事实,我调用了这样一个方法

self.sushiTypes = [[NSArray alloc]initWithObjects:"objects...];

但是,当我调试它时,它不是转到-(NSArray*)sushiTypes方法,而是转到setSushiTypes方法。这是为什么?

您将把寿司类型指向寿司类型的值。由于_-types是一个实例变量,您需要通过保留它来获得此对象的所有权。如果您未能做到这一点,并且该对象的所有其他所有者都释放了它,那么该内存将被释放,使您的实例变量指向垃圾,您的应用程序将崩溃

注意setter中消息的顺序也很重要。你需要打电话

[sushiTypes retain];

首先,因为sushiTypes和sushiTypes可能指向同一个对象。如果您将它们交换并首先调用release,那么在您有机会声明所有权之前,内存可能会被释放。

您将把sushiTypes指向sushiTypes的值。由于_-types是一个实例变量,您需要通过保留它来获得此对象的所有权。如果您未能做到这一点,并且该对象的所有其他所有者都释放了它,那么该内存将被释放,使您的实例变量指向垃圾,您的应用程序将崩溃

同样重要的是要注意setter中消息的顺序。你需要打电话

[sushiTypes retain];

首先,因为sushiTypes和sushiTypes可能指向同一个对象。如果您将它们交换并首先调用release,那么在您有机会声明所有权之前,内存可能会被释放。

是的,更具体地说,它可能会将retain计数初始化为1

是否与拥有[寿司]相同。我知道如果我们调用retain,该对象将被保留,直到我们释放它

不一样。这将使保留计数增加两倍。没有太多理由在同一个位置将保留计数增加两次。如果你这么做了,你就要负责给release打两次电话

你有一个很好的选择。该类型已作为参数传递给函数。稍后在函数中,您将其释放。它会释放寿司类型的内存吗?如果是,寿司类型是否不再存在

首先,您应该确保您了解释放是否释放内存取决于是否有其他所有者持有对该对象的引用。如果不止一件东西[\u-release]保留了该对象,那么在这种情况下release将不会释放内存

第二,坏主意。为了保持引用计数的合理性,您应该遵循某些模式

保留(或alloc)实例变量,在dealloc或之前释放它们。 如果需要,保留(或alloc)局部变量,并在退出该方法之前释放它们。 调用方不拥有函数的返回值。这意味着您像处理局部变量一样处理函数返回值,但在返回它之前自动释放它,而不是释放它。这确保了它至少能够持续足够长的时间,以便调用方在需要时保留它。 其中一种模式不是让方法调用方拥有对方法参数的引用,而是当函数返回时,调用方不拥有该引用。该方法不应释放调用方的引用

继续使用2.1,而不是发布类型。我创建了一个局部变量NSArray*sushiTypes=\u sushiTypes。如果我发布了寿司类型,它也会发布寿司类型。或者如果我保留寿司类型,它也会保留寿司类型吗

保留和释放发送到对象,而不是引用。sushiTypes和_sushiTypes指的是同一个对象,因此在一个对象上调用retain或release与在另一个对象上调用retain或release是相同的


[sushiTypes retain]是合法的,但可能是不必要的,以后使用相同的方法[\u sushiTypes release]。但不要只执行[sushiTypes release],从而剥夺sushiTypes对对象的所有权。

是的,更具体地说,它可能会将保留计数初始化为1

是否与拥有[寿司]相同。我知道如果我们调用retain,该对象将被保留,直到我们释放它

不一样。这将使保留计数增加两倍。没有太多理由在同一个位置将保留计数增加两次。如果你这么做了,你就要负责给release打两次电话

你有一个很好的选择。该类型已作为参数传递给函数。稍后在函数中,您将其释放。它会释放寿司类型的内存吗?如果是,寿司类型是否不再存在

首先,您应该确保您了解释放是否释放内存取决于是否有其他所有者持有对该对象的引用。如果不止一件东西[\u-release]保留了该对象,那么在这种情况下release将不会释放内存

第二,坏主意。为了保持引用计数的合理性,您应该遵循某些模式

保留(或alloc)实例变量,在dealloc或之前释放它们。 如果需要,保留(或alloc)局部变量,并在退出该方法之前释放它们。 调用方不拥有函数的返回值。这意味着您像处理局部变量一样处理函数返回值,但在返回它之前自动释放它,而不是释放它。这确保了它至少能够持续足够长的时间,以便调用方在需要时保留它。 其中一种模式不是让方法调用方拥有对方法参数的引用,而是当函数返回时,调用方不拥有该引用。该方法不应释放调用方的引用

继续使用2.1,而不是发布类型。我创建了一个局部变量NSArray*sushiTypes=\u sushiTypes。如果我相信
 [self setSushiTypes:whatever];
 self.sushiTypes = whatever;