zoukankan      html  css  js  c++  java
  • NSInvocation 返回值在ARC下面的释放问题

    一、先看下面的代码

    -(NSArray *) operationFromTakeoffAction:(NSString *) action AtPoint:(CGPoint) flightPoint
    {
        NSMethodSignature *methodSignature = [FlightOperations instanceMethodSignatureForSelector:NSSelectorFromString(action)];
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
    
        [invocation setTarget:fOps];
        [invocation setSelector:NSSelectorFromString(action)];
        [invocation setArgument:&flightPoint atIndex:2];
    
        NSArray *resultSet = [NSArray alloc]init];
        [invocation invoke];
        [invocation getReturnValue:&resultSet];
    
        return resultSet;
    }
    

      下面的代码会crash,Xcode提示的信息是 -[NSArray release] NSArray send release to deleacted object, 也就是NSArray对象重复释放了

      在ARC下面,一个方法返回的是autorelease对象的时候,通过NSInvocaton作为返回值的时候,注意调用的时候的方法,如果按照上面的方法

      resultSet默认是strong的,在这个方法底部,编译器会插入resultSet release的代码,同时getReturnValue 取的是指针的地址,将这个地址填充指向返回autorelease对象的地址,最后造成对象释放两次

      如果需要使用正确的结果,可以采用下面的方式

      

        或者同步的使用resultSet, 但是使用完成之后直接设置成nil

  • 相关阅读:
    项目冲刺之任务场景分析
    一位数组的最大子数组(debug版)
    软件工程课堂五(地铁项目的优化)
    人月神话阅读笔记02
    软件工程第七周总结
    人月神话阅读笔记01
    软件工程第六周总结
    构建之法阅读笔记03
    软件工程第五周总结
    软件工程课堂四(合作开发项目-地铁线路查询)
  • 原文地址:https://www.cnblogs.com/doudouyoutang/p/10304191.html
Copyright © 2011-2022 走看看