Объект не удаляется в ARC - PullRequest
0 голосов
/ 02 января 2012

Объект, созданный во втором объекте, не освобождается из-за того, что второй объект освобождается, если я не установил указатель в ноль в деаллоке, что не кажется правильным.

Я думал, что ARC должен был установить все указатели на ноль по умолчанию, когда объект освобождается, освобождая тем самым любые принадлежащие ему объекты.

Вот мой код (только для ядра):

@interface Obj1 : NSObject
{
    Obj2 *obj2;   
}

@interface Obj2 : NSObject
{
}

@implementation Obj1

-(void)dealloc
{
    obj2 = nil;  // <--- This is needed to get obj2 to be dealloc'd.
    NSLog(@"Obj1 dealloc");
}

-(id)init
{
    if ((self = [super init]) == nil)
        return nil;

    obj2 = [[Obj2 alloc] init];

    return self;
}

@end

@implementation Obj2

-(void)dealloc
{
    NSLog(@"Obj2 dealloc");
}

-(id)init
{
    if ((self = [super init]) == nil)
        return nil;

    return self;
}

@end

Я что-то не так делаю?Все, что я прочитал, говорит, что это должно работать.Никто больше не держит в obj2, так как установка его в ноль освобождает его.Я пробовал код с и без функций dealloc на тот случай, если он что-то напутал, и я получил те же результаты.

Указанные файлы компилируются как obj-c ++, но я неделать что-нибудь с c ++ и объектом.

Спасибо.

1 Ответ

1 голос
/ 02 января 2012

Это определенно должно работать так, как вы ожидаете.Вы, вероятно, делаете что-то случайно в коде, который вы запутали или вырезали из своего примера.Для демонстрации вы можете сохранить приведенный ниже код в некотором файле, например, arc_tst.m, скомпилировать его и запустить из терминала.Вы увидите, что он распечатывает все ожидаемые лог-операторы, а затем в итоге освобождает оба объекта.Объекты точно так же смоделированы в вашем примере кода, размещенном здесь (демонстрируя, что проблема, скорее всего, связана с какой-то другой частью вашего фактического кода).

Чтобы скомпилировать его, предполагая, что вы назвали его arc_tst.m,перейдите в каталог, в котором сохранен файл, затем введите следующее:

$ clang -fobjc-arc -o arc_tst arc_tst.m -framework foundation
$ ./arc_tst

arc_tst.m

// build with: clang -fobjc-arc -o arc_tst arc_tst.m -framework foundation

#import <Foundation/Foundation.h>

@class Obj1, Obj2;

@interface Obj1 : NSObject
{
  Obj2* _obj2;
}

@end

@interface Obj2 : NSObject
{
}

@end

@implementation Obj1

- (id)init
{
  if( (self = [super init]) )
  {
    _obj2 = [[Obj2 alloc] init];
  }
  return self;
}

- (void)dealloc
{
  NSLog(@"Obj1 Dealloc");
}

@end

@implementation Obj2

- (id)init
{
  if( (self = [super init]) )
  {
  }
  return self;
}

- (void)dealloc
{
  NSLog(@"Obj2 Dealloc");
}

@end

int main (int argc, char const *argv[])
{
 @autoreleasepool {
  Obj1* obj = [[Obj1 alloc] init];
  NSLog(@"after alloc, have obj1: %@", obj);
  sleep(2);
  NSLog(@"after sleep, have obj1: %@", obj);
  obj = nil; // force ARC to trash obj
  NSLog(@"after nil on obj1, about to exit");
 }
 return 0;
}
...