【发布时间】:2014-12-09 01:55:21
【问题描述】:
这是我指的代码。
// 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 的说法,这是基本规则:
如果您使用名称以“alloc”或“new”开头或包含“copy”的方法(例如,alloc、newObject 或 mutableCopy)创建对象,或者向其发送保留消息。您有责任放弃使用 release 或 autorelease 拥有的对象的所有权。其他任何时候您收到物品时,都不得释放它。
bobDevil 的句子“只担心您明确添加到项目的保留计数”让我点击了它。在阅读了 Apple 的所有权政策之后,本质上,创建新对象的对象/方法是负责释放 /it's/ 对它的兴趣的人。这是正确的吗?
现在,假设我是一个方法,它接收一个对象并将其分配给一个实例变量。我需要正确保留收到的对象,因为我仍然对它感兴趣?
如果其中有任何不正确的地方,请告诉我。
【问题讨论】:
标签: objective-c memory memory-management retain