沒有任何序言我想告訴你我在我的程序中遇到的問題,我評論了步驟和我對這些步驟的想法。 (我沒有包括@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 *
將是正確的路,在這種情況下情況將變得微不足道,但編譯器如何推理此代碼,我的錯誤在哪裏判斷?
這是一個有點人爲的問題,但我不能從我的頭上拋出這種情況,我想我失去了一些東西。
這裏是-[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'。 –