共有四个类别:
@implementation AClass
- (void)dealloc {
NSLog(@"a");
}
@end
@implementation BClass
- (void)dealloc {
NSLog(@"b");
}
@end
@implementation CClass
- (void)dealloc {
NSLog(@"c");
}
@end
@implementation DClass
- (void)dealloc {
NSLog(@"d");
}
@end
现在进行测试:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
AClass *a = [AClass new];
NSLog(@"1");
BClass *b = [BClass new];
NSLog(@"2");
[CClass new];
NSLog(@"3");
[DClass new];
NSLog(@"4");
}
控制台显示:
1 2 c 3 d 4 b a
问题:
为什么c
d
之前a
b
,为什么b
之前a
? >
答案 0 :(得分:0)
c和d没有可变的强引用,因此它将在a,b之前释放(c,d在创建后释放)。
我认为ARC
(自动引用计数)insert objc_release
的汇编调用c,d在a,b之前。
关于b在a之前释放,我认为ARC
将从底部到顶部释放变量。
您可以在viewDidLoad
功能处设置断点,然后选择菜单Debug>Debug Workflow>Always show disassembly
进行查看。
答案 1 :(得分:0)
在编译代码时,ARC自动添加retain
/ release
。
在这种情况下,c
和d
会立即释放,因为没有指向它们的强大指针。 a
和b
的变量具有很强的指针,当这些变量超出范围时(在方法末尾),编译器将添加一个release
调用。如果您将__weak
用作变量之一,它将立即被取消分配。
发布的a
和b
之间的顺序是ARC实施的详细信息,可能不明智,因为Clang不保证该顺序,因此可能会更改。 / p>