아무런 서문도없이 내 프로그램에 문제가 있음을 보여주고 싶습니다. 그 단계에 대한 단계와 생각을 주석 처리했습니다. 어떻게 오류 개체가 사후에 존재(NSError * __ 강한 *) 마법
@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;
}
(내가 곤란에 대한 @interface
부분을 포함하지 않았다, 그것은 @implementation
에서와 같은 서명 같은 방법이있다)? 나는 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'을 말할 필요가 없습니다. –