Вот код, который я имею в виду.
// 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 (preserveCount 1), а затем добавляю его в массив. Счет сохранения теперь равен 2, правильно? Если это два, я должен быть [p release] после добавления его в массив, возвращая значение keepCount в 1?
Правильно ли я в том, что ответственность вызывающего абонента заключается в том, чтобы освободить массив, возвращаемый методом? (Что также освободит память персонажа и их переменных экземпляра, если их количество будет равно 1).
Я прочитал документ управления памятью Apple, но я думаю, что я больше всего не понимаю, это то, что увеличивает количество объектов, удерживающих счет? Я думаю, что я понимаю идею того, кто несет ответственность за освобождение. Это основное правило, согласно Apple:
Вы получаете право собственности на объект, если его создаете с помощью метода, имя которого начинается с "alloc" или "new" или содержит "copy" (например, alloc, newObject или mutableCopy), или если вы отправляете сохранить сообщение. Вы несете ответственность за отказ от владения собственными вами объектами с помощью выпуска или авторекламы. В любой другой момент, когда вы получаете объект, вы не должны его отпускать.
Предложение bobDevil "только беспокоиться о том, что количество удержаний, которое вы добавляете в элемент явно, заставило его щелкнуть по мне. После прочтения политики собственности в Apple, по сути, объект/метод, создавший новый объект, является ответственным за освобождение/его/интерес к нему. Правильно ли это?
Теперь скажем, что я метод, который получает объект, и присваивает его переменной экземпляра. Мне нужно сохранить полученный объект правильно, поскольку у меня все еще есть интерес к нему?
Если это неверно, сообщите мне.