首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(NSError *__strong *)魔术

(NSError *__strong *)魔术
EN

Stack Overflow用户
提问于 2012-01-25 05:14:09
回答 1查看 442关注 0票数 1

在没有任何前言的情况下,我想向你展示我在程序中遇到的问题,我注释掉了步骤和我对这些步骤的想法。(为了简短起见,我没有包含@interface部件,它具有与@implementation中相同的方法和签名)

代码语言:javascript
复制
@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;
}

error对象死后是如何存在的?我知道使用NSError *__autoreleasing *将是正确的方法,在这种情况下情况将是微不足道的,但是编译器如何推理这段代码,我在判断中的错误在哪里?

这是一个有点做作的问题,但我不能把这种情况抛在脑后,我想我正在失去一些东西。

下面是-[Dummy testing:]反汇编的一部分

代码语言:javascript
复制
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   

如果我理解正确的话,这个方法中只有一个对象,而且它是明确释放的,而不是自动释放或其他什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-25 05:24:57

我怀疑你对即将发布的内容感到困惑。我只是检查了程序集的输出,有一个对objc_release()的调用,尽管我对x86程序集还不够熟悉,无法准确地跟踪正在发生的事情。但是,我确实知道这里的代码预计会发出类似以下内容的内容:

代码语言:javascript
复制
NSError *temp = [[NSError alloc] initWithDomain:@"hello" code:42 userInfo:nil];
[*error release];
*error = [temp retain];
[temp release];

当然,优化器会把它缩小到

代码语言:javascript
复制
NSError *temp = ...
[*error release];
*error = temp;

因此,我认为您看到了对objc_release()的调用,并认为您新分配的错误正在释放。事实并非如此。在将新分配的错误放置到该位置之前,将释放*error的先前值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8994251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档