Это определенно должно работать так, как вы ожидаете.Вы, вероятно, делаете что-то случайно в коде, который вы запутали или вырезали из своего примера.Для демонстрации вы можете сохранить приведенный ниже код в некотором файле, например, 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;
}