Вопрос о выпуске объекта - PullRequest
0 голосов
/ 25 марта 2011

У меня есть класс, который содержит объект NSArray. как это

#import <Foundation/Foundation.h>


@interface myClass : NSObject {
    NSArray *myArray;
}

@property (nonatomic, retain) NSArray *myArray;

@end

В файле .m я инициирую myArray в методе init и освобождаю myArray в методе dealloc.

в методе я создаю его объект и добавляю его в NSMutableArray.

myClass *my = [[myClass alloc] init];
NSLog(@"init finish %d",[my retainCount]);
NSMutableArray *a = [[NSMutableArray alloc] init];
[a addObject:my];
NSLog(@"array added finish %d",[my retainCount]);
NSLog(@"array added finish %d",[my.myArray retainCount]);

[my release];

Когда я добавляю объект "my" в NSMutableArray, добавляется retainCount из "my". но myArray не было. Означало ли это, что я должен сохранить свой Array самостоятельно? или что-то другое, что я могу сделать. Может ли этот код работать нормально после того, как я выпустил «мой» объект?

[a objectAtIndex:0];

Спасибо!

Ответы [ 2 ]

3 голосов
/ 25 марта 2011

Еще один замечательный пример того, почему вы должны ...

НИКОГДА не вызывать -retainCount!

retainCount бесполезен, вводит в заблуждение и тратит ваше время.

Вв этом случае причина, по которой счет удержания оказывается «неожиданно» равным нулю, заключается в том, что my.myArray возвращает nil. Это происходит потому, что вы никогда не назначаете созданный изменяемый массив для myArray.

Вам нужно что-то вроде этого (имя класса с заглавной буквы следует соглашению):

MyClass *my = [[MyClass alloc] init];
NSMutableArray *a = [[NSMutableArray alloc] init];
my.myArray = a;
[a addObject:my];

Обратите внимание, что это создает цикл сохранения между my и массивом.Т.е. вам нужно будет удалять my из массива вручную (или удалять массив из my вручную) всякий раз, когда вы выпускаете myArray, и, конечно, вы не можете сделать это в dealloc, потому что dealloc будетникогда не вызывать, пока my не будет удалено из myArray.

1 голос
/ 25 марта 2011

Я не уверен, что это полный исходный код выше, но для того, чтобы my.myArray был сохранен, вам нужно что-то присвоить ему.

Итак, в приведенном выше примере вы создали NSMutableArray:

NSMutableArray *a = [[NSMutableArray alloc] init];

А потом вы добавили в него свой класс:

[a addObject:my];

Но где вы создали массив и присвоили его myClass, как в:

NSArray *anArray = [[NSArray alloc] init.....];
my.myArray = anArray;

В этот момент myArray получит ссылку на объект и сохранит его (поскольку вы указали сохранение в объявлении реквизита myArray).

Возможно, если вы пояснили, что вы пытаетесь сделать, или разместили более полный исходный код?

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