這裏是我所指的代碼。增加對象的保留數量是什麼?
// 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釋放]添加到數組中,將retainCount降回到1?
我是對的,因爲調用者的責任是釋放該方法返回的數組? (這也會釋放人的記憶,以及它們的實例變量,假設它們的計數爲1)。
我已經閱讀了Apple的內存管理文檔,但是我猜我最不清楚的是增加一個對象的保留數量?儘管如此,我認爲我掌握了要釋放誰的責任。根據Apple的說法,這是基本規則:
如果您使用名稱以「alloc」或「new」開頭或包含「copy」的方法創建對象,則取得對象的所有權(例如alloc ,newObject或mutableCopy),或者如果您發送保留消息。您有責任放棄使用發行版或自動發行版所擁有的對象的所有權。任何其他時間你收到一個對象,你不能釋放它。
bobDevil的句子「只擔心你明確添加到項目中的保留數」讓它爲我點擊。在閱讀Apple的所有權政策後,本質上,創建新對象的對象/方法是負責釋放/關注它的人。它是否正確?
現在,讓我們說一個方法,它接收一個對象,並將它分配給一個實例變量。我需要保留正確的接收對象,因爲我仍然對它有興趣?
如果有任何不正確的地方,請告訴我。
Josh說默認情況下NSMutableArray標記爲autorelease? – 2009-07-25 03:01:57