プリアンブルなしで私は自分のプログラムに問題があることを示したいと思います。そのステップのステップと私の考えをコメントしました。 (私は息切れのため@interface
一部が含まれていなかった、それは@implementation
と同じシグネチャを持つ同じメソッドを持っている)(NSError * __ strong *)magic
@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 *
を使用して行くことが正しい方法であることを理解し、状況はその場合には些細なものですが、このコードのコンパイラの推論は、判断の間違いはどこですか?
これは少し人工的な質問ですが、私は頭からこのような状況を捨てることはできません、私は何かを失っていると思います。ここで
は私が正しく理解している場合、1つのオブジェクトのみがこの方法であり、それが明確に自動解放または何か他のものではない、リリースさ-[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'と言う必要はありません。 –