这是我指的代码。
// 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 循环中,我分配了一个人(retainCount 1),然后将其添加到数组中。保留计数现在是 2,对吧?如果它是两个,我应该在将它添加到数组之后 [p release]'ing,使 retainCount 回落到 1?
我是否正确,调用者有责任释放该方法返回的数组?(这也将释放 Person 及其实例变量的内存,假设它们的计数为 1)。
我已经阅读了 Apple 的内存管理文档,但我想我最不清楚的是什么会增加对象保留计数?不过,我想我掌握了谁负责释放的想法。根据 Apple 的说法,这是基本规则:
如果您使用名称以“alloc”或“new”开头或包含“copy”(例如,alloc、newObject 或 mutableCopy)的方法创建对象,或者向其发送保留消息,则您将获得对象的所有权。您有责任放弃使用 release 或 autorelease 拥有的对象的所有权。任何其他时间您收到一个对象,您都不能释放它。
bobDevil 的句子“只担心你明确添加到项目中的保留计数”让它点击了我。在阅读了 Apple 的所有权政策之后,本质上,创建新对象的对象/方法是负责释放 /it's/ 对它的兴趣的人。它是否正确?
现在,假设我有一个方法,它接收一个对象,并将它分配给一个实例变量。我需要正确保留收到的对象,因为我仍然对它感兴趣?
如果其中任何一个不正确,请告诉我。