zoukankan      html  css  js  c++  java
  • Objc中2维指针作为输出参数时由ARC及@autoreleasepool引发的血案

    先看下面一个例子

    #import <UIKit/UIKit.h>
    
    #import "AppDelegate.h"
    
    
    @interface Something : NSObject
    
    - (void)doWithError:(NSError **)outError;
    
    @end
    
    @implementation Something
    
    - (void)doWithError:(NSError **)outError
    {
        @autoreleasepool
        {
            *outError = [NSError errorWithDomain:@"Emergency" code:999 userInfo:nil];
        }
    }
    
    @end
    
    int main(int argc, const char *argv[])
    {
        @autoreleasepool
        {
            NSError *error = nil;
    
         // Sometimes EXC_BAD_ACCESS when return from this method. [[[Something alloc] init] doWithError:&error]; // At this point, the main thread gives EXC_BAD_ACCESS. NSLog(@"%@", error); } return 0; }

     在NSLog输出的时候会EXC_Bad_ACCESS

      

    正确写法应该是这样:

    @interface Something : NSObject
    
    - (void)doWithError:(NSError **)outError;
    
    @end
    
    @implementation Something
    
    - (void)doWithError:(NSError **)outError
    {
        NSError *error = nil;
        @autoreleasepool
        {
            error = [NSError errorWithDomain:@"Emergency" code:999 userInfo:nil];
            // Do something
        }
        if(error)
        {
            *outError = error;
        }
    }
    
    @end
    
    int main(int argc, char * argv[])
    {
        @autoreleasepool
        {
            NSError *__autoreleasing error = nil;
            
            [[[Something alloc] init] doWithError:&error];
            
            // At this point, the main thread gives EXC_BAD_ACCESS.
            NSLog(@"%@", error);
            
            int a = 1;
            ++a;
        }
        return 0;
    }
    
  • 相关阅读:
    AJAX跨域JS访问
    dd
    学习java,搭建一个英文名著轻松阅读网站
    超载问题求解!!!
    nginx + uwsgi 部署Django项目
    一种算法问题,求指点!
    js除法余数
    button捕捉回车键
    为SQL表添加全文索引范例
    .Net刷新页面的小结
  • 原文地址:https://www.cnblogs.com/csutanyu/p/3782953.html
Copyright © 2011-2022 走看看