这是我参考的代码。
// 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),然后将其添加到数组中。这时的retain count是2吗?如果是两个,那么在将其添加到数组后,我应该[ p release],将retainCount降回到1吗?
我想问一下,是否正确的做法是由调用者负责释放方法返回的数组?(假设它们的计数都为1,则还会释放Person及其实例变量的内存)。
我已经阅读了苹果的内存管理文档,但我最不清楚的是什么会增加对象的保留计数?尽管我想我理解了谁负责释放的概念。这是苹果的基本规则:
如果您使用以“alloc”或“new”开头或包含“copy”的方法创建对象(例如, alloc,newObject或 mutableCopy),或者发送retain消息,则拥有该对象。您负责使用release或autorelease放弃拥有对象。任何其他时间收到对象,您不能释放它。
bobDevil的句子“只关心您明确添加到项中的retain counts”让我恍然大悟。在阅读苹果的所有权政策后,本质上,创建新对象的对象/方法负责释放或释放其对它的兴趣。这个理解正确吗?
现在,假设我有一个方法,该方法接收一个对象并将其分配给实例变量。我需要保留接收到的对象,因为我仍然对它有兴趣,对吗?
如果有任何不正确的地方,请让我知道。