Поведение удерживаемого имущества при сохранении его владельца - PullRequest
1 голос
/ 24 марта 2010

Я начинающий программист ObjectiveC из мира C ++. Мне очень трудно понять управление памятью, предлагаемое NSObject: /

Скажем, у меня есть следующий класс:

@interface User : NSObject
{
  NSString* name;
}

@property (nonatomic,retain) NSString* name;

- (id)   initWithName: (NSString*) theName;
- (void) release;

@end

@implementation User

@synthesize name

- (id) initWithName: (NSString*) theName
{
    if ( self = [super init] )
    {
        [self setName:theName];
    }
    return self;
}

- (void) release
{
    [name release];
    [super release];
}

@end

Не учитывая следующий код, я не могу понять результаты сохранения:

NSString* name = [[NSString alloc] initWithCString:/*C string from sqlite3*/];
// (1) name retainCount = 1
User* user = [[User alloc] initWithName:name];
// (2) name retainCount = 2
[whateverMutableArray addObject:user];
// (3) name retainCount = 2
[user release];
// (4) name retainCount = 1
[name release];
// (5) name retainCount = 0

В (4) количество сохраненных имен уменьшилось с 2 до 1. Но это не правильно, в массиве все еще есть экземпляр user, который указывает на имя! Число сохраняемых переменных должно уменьшаться только тогда, когда число сохраняющих ссылающихся переменных равно 0, то есть когда оно отменено, не освобождено.

Ответы [ 2 ]

4 голосов
/ 24 марта 2010

Вы не должны переопределять release, вам следует переопределить только dealloc. Когда счетчик сохранения для user достигнет нуля, будет вызван его dealloc, выпустив name.

Если вы переименуете свое release переопределение на dealloc, счетчики сохранят свои ожидания.

2 голосов
/ 24 марта 2010

В User это:

- (void) release

Должно быть:

- (void) dealloc

Вы смешиваете name и user управление памятью - каждый объект имеет свою собственную память.

В 4) вы вызываете свой собственный метод release, который не NSObject release, поэтому я предполагаю, что он не будет работать должным образом. Измените имя с release на dealloc на вашем User.

После исправления мы можем посмотреть, какие еще у вас проблемы.

...