Как составные объекты выпущены, когда NSMutableArray, который содержит те объекты, выпущены? - PullRequest
0 голосов
/ 04 ноября 2011
@implementation TestClass

- (id) init
{
    string = [[NSString alloc] init];
    return self;
}

- (void) release
{
    [string release];
}

@end



@implementation MainScreen

- (void) addItems
{
    [myMutableArray addObject:[[[TestClass alloc] init] autorelease]];
}

- (void) release
{
    [myMutableArray release];
}

Мой вопрос: когда мы выпускаем myMutableArray, он будет вызывать метод выпуска TestClass или нет?

Ответы [ 4 ]

4 голосов
/ 04 ноября 2011

Нет, это не так, как работает управление памятью Какао.Когда вы добавляете объект в массив, массив выражает, что ему принадлежит объект, отправляя сообщение -retain.Массив сохраняет это владение до тех пор, пока сам не исчезнет (т.е. будет освобожден), затем ему больше не нужен объект и он отправит ему -release, чтобы отказаться от владения.Массиву не нужно сохранять или освобождать объекты каждый раз, когда он сохраняется или освобождается.

Подводя итог: объекты сохраняют другие объекты, когда им нужно взять их в свои владения, и освобождают их, когда они больше не нуждаются в этом.владение.

Это указывает на неправильное управление памятью string ivar.Вы правильно владеете строкой нулевой длины в -init (где я использую «правильно» в очень свободном смысле), но затем каждый раз, когда ваш объект освобождается, он освобождает строку.Подумайте:

TestClass *obj = [[TestClass alloc] init];
[obj retain];
[obj release];
[obj release];

вышеизложенное может привести к сбою (а если нет, то вам очень не повезло).Вы должны освободить строку в -dealloc, когда вашему объекту, наконец, она больше не нужна.Если вы меняете объект, на который ссылается ivar, вам также необходимо сменить владельца.

3 голосов
/ 04 ноября 2011

Никогда не отменять -release!То, что вы хотите переопределить, это -dealloc!И там вы должны позвонить [super dealloc]

Пожалуйста, прочитайте http://developer.apple.com/library/mac/documentation/cocoa/conceptual/memorymgmt/MemoryMgmt.pdf

И на ваш вопрос, если ваш массив освобождается, каждый объект в массиве отправляется сообщение release.

2 голосов
/ 04 ноября 2011

Вы должны переписать метод - (void) dealloc, а не метод - (void) release; и всегда звоните [super dealloc] в конце. Да, освобождение NSMutableArray приводит к освобождению отдельных объектов.

1 голос
/ 04 ноября 2011

так же, как

[myMutableArray addObject:[[[TestClass alloc] init] autorelease]];

будет увеличивать retainCount до экземпляра TestClass

, поэтому будет освобождать декрет retainCount для всех объектов в массиве

, отметим, что deallocэто метод для реализации в вашем пользовательском классе, он вызывается при освобождении вашего объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...