【发布时间】:2012-01-24 21:14:08
【问题描述】:
没有任何前言,我想向您展示我在程序中遇到的问题,我注释掉了步骤和我对这些步骤的想法。 (为了简短起见,我没有包含@interface 部分,它具有与@implementation 相同的签名相同的方法)
@implementation Dummy
- (int)testing:(NSError *__strong *)error
{
*error = [[NSError alloc] initWithDomain:@"hello" code:42 userInfo:nil];
// 3. retain count = 1
// 4. because of ARC 'error' object was released for this time
// (assembly output is my proof) object is deallocated
// retain count = 0
return 0;
}
@end
int main()
{
NSError *e = nil; // 1. retain count = 0 (obviously)
Dummy *dummy = [[Dummy alloc] init];
[dummy testing:&e]; // 2. passing reference to an error object
// 'e' for this time has to be just a trash, or nil maybe,
// but next log gives me correct output:
NSLog(@"%@ %li", [e domain], [e code]); // 'hello 42'
return 0;
}
错误对象死后如何存在?我知道使用NSError *__autoreleasing * 是正确的方法,在这种情况下情况将是微不足道的,但是编译器如何推理这段代码,我的判断错误在哪里?
这是一个人为的问题,但我无法将这种情况从我的脑海中抛开,我想我正在失去一些东西。
这是-[Dummy testing:]的部分反汇编
callq 0x100000e8c <dyld_stub_objc_msgSend>
mov -0x18(%rbp),%rcx
mov (%rcx),%rdx
mov %rax,(%rcx)
mov %rdx,%rdi
callq 0x100000e92 <dyld_stub_objc_release>
mov -0x24(%rbp),%eax
add $0x40,%rsp
pop %rbp
retq
如果我理解正确的话,这个方法中只有一个对象,而且很明显是释放的,不是自动释放的什么的。
【问题讨论】:
-
顺便说一句,在 ARC 下,所有对象堆栈变量都被初始化为 nil,所以你不需要在
NSError *e的声明中说= nil。
标签: objective-c automatic-ref-counting