gpt4 book ai didi

objective-c - 是什么增加了对象的保留计数?

转载 作者:IT王子 更新时间:2023-10-28 23:31:13 26 4
gpt4 key购买 nike

这是我指的代码。

// Person.h

@interface Person : NSObject {
NSString *firstName;
NSString *lastName;
}
@end

// Person.m

@implementation Person
- (id)init {
if (![super init]) return nil;
firstName = @"John";
lastName = @"Doe";
}
@end

// MyClass.m

@implementation MyClass
.....
- (NSArray *)getPeople {
NSMutableArray *array = [[NSMutableArray alloc] init];

int i;
for (i = 0; i < 10; i++) {
Person *p = [[Person alloc] init];
[array addObject:p];
}

return array;
}
.....
@end

现在,我知道此示例代码中没有进行内存管理。需要什么?

在 getPeople 循环中,我分配了一个 Person (retainCount 1),然后将其添加到数组中。保留计数现在是 2,对吧?如果是两个,我应该在将它添加到数组后 [p release]'ing,将 retainCount 降回 1 吗?

我说得对吗?释放方法返回的数组是调用者的责任吗? (这也将释放 Person 及其实例变量的内存,假设它们的计数为 1)。

我已经阅读了 Apple 的内存管理文档,但我想我最不清楚的是,是什么增加了对象的保留计数?不过,我想我掌握了谁负责释放的想法。根据 Apple 的说法,这是基本规则:

You take ownership of an object if you create it using a method whose name begins with “alloc” or “new” or contains “copy” (for example, alloc, newObject, or mutableCopy), or if you send it a retain message. You are responsible for relinquishing ownership of objects you own using release or autorelease. Any other time you receive an object, you must not release it.

bobDevil 的句子“只担心您明确添加到项目的保留计数”让我点击了它。在阅读了 Apple 的所有权政策之后,本质上,创建新对象的对象/方法是负责释放/it's/对它的兴趣的人。这是正确的吗?

现在,假设我是一个方法,它接收一个对象并将其分配给一个实例变量。我需要正确保留收到的对象,因为我仍然对它感兴趣?

如果其中有任何不正确的地方,请告诉我。

最佳答案

您是正确的,将保留计数添加到数组后为 2。但是,您应该只担心显式添加到项目的保留计数。

保留一个元素是一份契约(Contract),上面写着“我还没和你做完,不要走开。”一个基本的经验法则(也有异常(exception),但通常记录在案)是在分配对象或创建副本时,您拥有该对象。这意味着您将获得保留计数为 1(未自动释放)的对象。在这两种情况下,您应该在完成后释放它。此外,如果您曾明确保留一个对象,则必须释放它。

因此,具体到您的示例,当您创建 Person 时,您有一个保留计数。你将它添加到一个数组中(不管它做什么,你不在乎),然后你就完成了 Person,所以你释放它:

Person *p = [[Person alloc] init]; //retain 1, for you
[array addObject:p]; //array deals with p however it wants
[p release]; //you're done, so release it

另外,正如我上面所说,您通常只在分配或复制期间拥有该对象,因此为了与另一方面保持一致,您应该返回自动释放的数组,以便 getPeople 方法的调用者这样做不拥有它。

return [array autorelease];

编辑: 正确,如果你创建它,你必须释放它。如果您对它投资兴趣(通过保留),您必须释放它。

关于objective-c - 是什么增加了对象的保留计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1181010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com