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;
    }
    
  • 相关阅读:
    事件(三):事件对象
    事件(二):事件处理程序
    事件(一):事件流
    nginx里面的rewrite配置
    详解 CSS 居中布局技巧
    jQuery 效率提升建议
    web的攻击技术
    前端优化点总结
    深入理解递归和闭包
    创建对象
  • 原文地址:https://www.cnblogs.com/csutanyu/p/3782953.html
Copyright © 2011-2022 走看看